【问题标题】:using a combination of positional parameters and 1 named parameter使用位置参数和 1 个命名参数的组合
【发布时间】:2016-02-07 16:09:15
【问题描述】:

我仍在使用这些功能“烘烤”我的外壳,所以我的问题听起来可能不像“完全准备好”......它更多的是“设计这个的最佳方法是什么”而不是“我遇到了这个错误”否则这将不起作用..现在我该怎么办”,所以请耐心等待。当我解释时
我正在考虑一个可以在 2 种模式下运行的 shell 程序

  • 标准模式是一堆位置参数
    例如myprogram date1 date2 date3 date4 # can go on indefinitely
  • 命名参数模式
    myprogram -r date1 # Just 1 date para allowed

它们当然是互斥的 myprogram date1 date2 date3 date4 可以
myprogram -r date1 date2 date3 date4 不是因为 -r 只需要 1 个参数

我知道getopts 提供了一个命名参数功能,可以通过一系列选项shift
我已准备好标准模式并可以正常工作,并希望将“添加”到代码中以获取命名参数模式
在标准模式下,我的代码模式类似于

for args
do
stuff that I want done here 
shift
done

这就是我对命名参数模式逻辑的想法
(当我使用 getopts 和更多使用 1 个位置参数时,它应该退出。)
getopts 只允许 1 个参数,我正在考虑这样的一些

while getopts "r:"  opt; 
do
case statement of getopts 
<stuff I want to do >
esac 
done


并且为了将位置 paras 限制为 1,我应该有这样的东西?
[ "$#" -eq 2 ] || die " more than 1 para not expected here"
2 是因为当我在上面的 while 循环中时,-r 是第一个位置。 para 和 1 para 是变量之一。我必须在循环内进行检查,因为如果不使用-r 选项,我希望它在不做任何事情的情况下通过,在这种情况下,我可以拥有所需数量的 pos 参数
所以我怎么做这个最好——这就是我想要理解的。 将getopts 代码放在第一位,然后使用位置参数代码? 对不起,如果我的问题过于具体。

【问题讨论】:

  • myprogram date1myprogram -r date1 有区别吗?如果没有,请不要在界面中添加不必要的选项。
  • 是的,myprogram date1 只获取第一级日期,myprogram -r date 将递归获取数据,这就是为什么递归选项只需要 1 个日期参数而不是一堆 em。感谢收看!

标签: linux bash shell unix getopts


【解决方案1】:

我并不总是使用 getopts,但当我使用时,它看起来像这样:

...

#Defaults
Verbose=false
ropt=false

# Options
while getopts vr: opt; do
  case "$opt" in
    v)  Verbose=true; vopt="-v" ;;
    r)  ropt=true; rarg="$OPTARG" ;;
    *)  usage; exit 1 ;;
  esac
done
shift $((OPTIND - 1))

if $ropt && [ $# -gt 0 ]; then
  $Verbose && echo "Too many arguments. Bye." >&2
  exit 1
elif $ropt; then
  args=( "$rarg" )
else
  args=( "$@" )
fi

# then...
for thing in "$args"; do
  ... something with $thing ...
done

getopts 循环后的第一个条件控制您是在多参数还是单参数 (-r) 模式下运行。随后的elses 填充$args 数组,然后您可以在以后做任何您喜欢的事情。

【讨论】:

    【解决方案2】:

    我使用getopts 而不是getopt,但我认为逻辑是相同的。循环遍历命名选项,然后在完成后,如果您尚未设置选项,只需使用其余选项即可。

    ARGS=$(getopt --options=r: --name="$0" -- "$@");
    if [ $? -ne 0 ]; then
        echo_usage
        exit 1
    fi
    
    eval set -- "$ARGS";
    
    while true; do
        case $1 in
            -r)
                shift
                date1=$1
            ;;
    done
    
    if [ -z "$date1" -a ! -z "$1" ]; then
        date1=$1
    fi
    

    【讨论】:

      猜你喜欢
      • 2020-04-27
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 2018-07-21
      • 2021-08-12
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      相关资源
      最近更新 更多