如何让 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))"
如果您走这条路,您需要添加自己的错误处理,例如第二个参数不存在/为空/看起来像一个选项而不是参数。