下面的代码:
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'时,我仍然得到版本输出。
我想说的是,我的脚本应该忽略所需字母后面的所有字母。
为什么会这样?有人能给点建议吗?
2条答案
按热度按时间v64noz0r1#
循环一次解析和处理一个选项,
-hg
被视为两个单独的选项,-h
和-g
。由于循环首先遇到-h
,因此它触发helpMe
并退出,而不解析-g
。如果您要使用-gh
运行脚本,您会看到当它遇到-g
选项时会失败,因为在本例中它首先出现。如果你不喜欢这种行为,你可以使用一个变量来存储状态,让
getopts
完成解析,然后测试-h
:vpfxa7rd2#
getopts
将处理参数 * 一次一个 *,因此,当它遇到-h -g
中的h
(-hg
的扩展)时,它将运行helpMe
,然后退出。这意味着它永远不会在选项中找到
-g
。处理这个问题最简单的方法是简单地声明,在
-h
上,它将输出帮助文本并退出,而不管有什么其他参数。如果您想确保参数是有效的,只需将它们的状态存储在选项检查代码中,并 * 在以后 * 处理它们。
这样,检查将在任何操作之前完成。类似于:
如果指定
-h
或-hv
,则会给予帮助并退出;如果指定-v
,则会提供版本信息并退出;如果提供任何其他选项,则会返回错误并退出。如果您指定 no 选项,它只会在注解之外执行脚本要执行的任何操作。