我正在尝试获取一个脚本来:
-q
使用选项设置变量- 显示
-h
选项的帮助,以及 - 其他选项失败
-*
,但允许位置参数
这是getopts
我正在使用的片段:
while getopts qh opt; do
case "${opt}" in
q)
quiet="true"
;;
h)
usage
exit 1
;;
\?)
echo "unrecognized option -- ${OPTARG}"
exit 1
;;
esac
shift
done
echo "unparsed: $*"
这看起来非常简单。但是,只有当我提供单个参数(a.sh -q
或a.sh -h
执行预期的操作)时,它才有效。
但是,如果我提供两个参数,或者提供 $2 处无法识别的参数,它不会执行任何操作:
$ ./a.sh -b
unrecognized option -- b
$ ./a.sh -q -b
unparsed: -b
$ ./a.sh -h -k
this is my help message
unparsed: -k
知道为什么第二个参数 ($2) 没有在 getopts 循环中处理吗?
答案1
命令shift
放错地方了。它应该是外部循环的while
。尝试:
while getopts :qh opt; do
case "${opt}" in
q)
quiet="true"
;;
h)
usage
exit 1
;;
\?)
echo "unrecognized option -- ${OPTARG}"
exit 1
;;
esac
done
shift $((OPTIND - 1))
echo "unparsed: $*"
例子
如果我们将以下行添加到代码的开头:
usage() { echo "this is my help message"; }
然后我们可以做这些测试:
$ ./a.sh -q -foo
unrecognized option -- f
$ ./a.sh -q -h
this is my help message