我有以下代码:
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'只要。 但是当我举起国旗时,例如' hg'我仍然得到帮助输出。 当我给旗帜" va"我仍然得到版本输出。 我想说的是我的脚本在所需的字母之后忽略了所有字母。
为什么会这样? 有人可以建议吗?
谢谢。
答案 0 :(得分:0)
循环解析和处理选项,-hg
被视为两个单独的选项,-h
和-g
。由于循环首先遇到-h
,它会触发helpMe
并退出而不会解析-g
。如果您使用-gh
运行脚本,您会看到它在遇到-g
选项时失败,因为在这种情况下它首先出现。
如果您不喜欢这种行为,可以使用变量来存储状态,让getopts
完成解析并在之后测试-h
:
while getopts ":vh" opt; do
case $opt in
h)
opt_h=true
;;
[...]
esac
done
if [ "${opt_h}" = true ]; then
helpMe
exit 0
fi
答案 1 :(得分:0)
在您的两个选择中都是exit
的来电。 getopts
将一次处理一个参数,这样当它h
-h -g
中的-hg
(helpMe
的扩展)时,它会运行-g
然后退出。
这意味着它永远不会在选项中找到-h
。
处理此问题的最简单方法是简单地说明,在flag_v=0
flag_h=0
while getopts ":vh" opt; do
case $opt in
(h)
flag_h=1
;;
(v)
flag_v=1
;;
\?)
echo -e "Invalid option: -$OPTARG\ntype -h for more help.\n" >&2
exit 1
;;
esac
done
if [[ $flag_h -eq 1 ]] ; then
helpMe
exit 0
fi
if [[ $flag_v -eq 1 ]] ; then
showVersion
exit 0
fi
# Now continue, neither h nor v was specified.
上,它将输出帮助文本并退出,无论其他参数是什么。
如果您想确保参数有效,只需将它们的状态存储在选项检查代码中,然后再处理它们。
这样,检查将在任何操作之前完成。像这样:
-h
如果您指定-hv
或-v
版本信息,则会提供帮助并退出,如果您指定{{1}}则退出,如果您提供任何其他选项,则退出并显示错误。< / p>
如果您指定 no 选项,它将继续执行注释以执行您的脚本要执行的操作。