我有以下代码:
while getopts ":vh" opt; do
case $opt in
(h)
helpMe
exit 0
;;
(v)
version1
exit 0
;;
\?)
echo -e "Invalid option: -$OPTARG\ntype -h for more help.\n" >&2
exit 1
;;
esac
done
此代码应仅获取标志“h”和“v”。
但是当我给flag例如'hg'时,我仍然得到帮助输出。
另外,当我给标志“va”时,我仍然得到版本输出。
我想说的是,我的剧本是忽略所有字母后的一个要求。
为什么会这样?
有人能建议一下吗?
谢谢您。
最佳答案
循环一次分析和处理一个选项,-hg
被视为两个单独的选项,-h
和-g
。由于循环遇到-h
首先触发了helpMe
和退出,而没有解析“cc>”。如果使用-g
运行脚本,您会看到它在点击-gh
选项时失败,因为它在本例中是第一个。
如果您不喜欢这种行为,可以使用变量来存储状态,让-g
完成解析,然后测试getopts
:
while getopts ":vh" opt; do
case $opt in
h)
opt_h=true
;;
[...]
esac
done
if [ "${opt_h}" = true ]; then
helpMe
exit 0
fi