我正在尝试扩展源代码脚本中的getopts,如下所示。如果传入a、b、c、d以外的选项,则需要打印"invalid option“并退出。
script_a.sh:
#!/bin/bash
script_a_getopts() {
while getopts 'a:b:' OPT; do
case "$OPT" in
a)
a=$OPTARG
;;
b)
b=$OPTARG
;;
*)
echo "invalid option"
exit 1
;;
esac
done
}script_b.sh
#!/bin/bash
source script_a.sh
while getopts ':c:d:' OPT; do
case "$OPT" in
c)
c=$OPTARG
;;
d)
d=$OPTARG
;;
[?])
script_a_getopts $@
esac
done
echo "a=$a"
echo "b=$b"
echo "c=$c"
echo "d=$d"当我运行脚本时,它没有像预期的那样工作,显然我犯了一个错误。
$ ./script_b.sh -c cat -d dog -a apple -b boy
a=
b=
c=cat
d=dog传递-x时未抛出错误。
$ ./script_b.sh -x
a=
b=
c=
d=发布于 2019-12-10 11:47:19
简而言之:在调用script_a_getopts之前,您必须回滚OPTIND。
case "$OPT" in
c)
c=$OPTARG
;;
...
[?])
let OPTIND--
script_a_getopts $@
esac
done长长的答案:
getopts跟踪使用OPTIND变量处理过的参数。当顶级getopts识别出未知项时,它已经通过将OPTIND移动到下一个参数来“消费”它。要让script_a_getopts处理该参数,需要回滚OPTIND以指向未处理的参数。
let OPTIND--将允许重新处理无法识别的参数。
附注:如果您希望允许以任意顺序(-c cat -a apple -d dog -b boy)放置选项,则必须在script_a_getopts中重复相同的操作。这将需要改进script_a_getopts函数中的错误处理。
https://stackoverflow.com/questions/59257856
复制相似问题