BASH getopts 选项后有更多参数

BASH getopts 选项后有更多参数

如何让 getopts 在 -h 选项后接受 2 个参数?我的意思是它应该保存在数组中,但要么它不起作用,要么我犯了这样的错误: echo " ${array[1]} ${array[2]}"

 OPTIND=1 
    hh=
    while getopts "h:" flag
    do
    case "$flag" in
    h)
    hh=($OPTARG)  ;;
   esac
   done
   shift "$((OPTIND-1))"

答案1

-h一种方法是多次传递:

OPTIND=1 
hh=()
while getopts h: flag; do
  case "$flag" in
    h) hh+=("$OPTARG");;
  esac
done
shift "$((OPTIND-1))"

并将其称为:

myscript -h host1 -h host2...

答案2

这不可能。您可以做的就是传递引用的两个参数并用适当的分隔符分隔,然后拆分OPTARG以获得两个部分。

可能的调用语法的示例是:

prog -h part1:part2

prog -h "part1 part2"

在您的case声明中,您可以通过以下方式拆分组件,例如在冒号分隔符的情况下:

p1=${OPTARG%:*} p2=${OPTARG#*:}

编辑(澄清):“适当的分隔符”是不属于单个part1/part2组件的分隔符(因此在复合中是唯一的OPTARG),因此分割是明确的。

答案3

简短的回答:getopts不打算这样使用。

长答案:您可以尝试类似的方法(未经测试),但getopts无法进行语法检查:

OPTIND=1 
hh=()
args=( "$@" )
while getopts "h:" flag; do
  case "$flag" in
  h)
    hh=("$OPTARG" "${args[$OPTIND]}")
    $((OPTIND++))
    ;;
  esac
done
shift "$((OPTIND-1))"

如果您走这条路,您需要添加自己的错误处理,例如第二个参数不存在/为空/看起来像一个选项而不是参数。

相关内容