如果getopts中提供了多个选项,而某些选项需要参数而某些选项不需要参数,该怎么办? getopts参数选择下一个参数作为参数
#!/bin/bash
while getopts ":a:b:cde:f:g:" opt; do
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
b)
echo "-b was triggered, Parameter: $OPTARG" >&2
;;
c)
echo "-c was triggered, Parameter: $OPTARG" >&2
;;
d)
echo "-d was triggered, Parameter: $OPTARG" >&2
;;
e)
echo "-e was triggered, Parameter: $OPTARG" >&2
;;
f)
echo "-w was triggered, Parameter: $OPTARG" >&2
;;
g)
echo "-g was triggered, Parameter: $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
这是我的问题:
$ ./hack.bash -a -b
-a was triggered, Parameter: -b
不应该显示-a缺少参数而不是将下一个选项作为参数。我在这里做错了什么?
答案 0 :(得分:0)
如果命令行选项接受参数,则必须提供该参数,因此它是正确的,并且期望getopts "a:b"
将-a -b
作为带有参数{{1}的选项-a
进行解析}}。其他方面,没有办法提供以破折号开头的参数。 (请记住,shell字符串与其他编程语言一样,只是普通字符的数组。在shell命令行中输入字符时引用字符的事实不会改变字符的内部表示,因此{{1} }和-b
无法区分。
一些较旧的命令行实用程序确实为可选的选项参数提供了一种机制。关于解析参数的Posix指南强烈反对这种风格,但这样做的实用程序通常早于指南。在任何情况下,准则都只是 - 指导方针,而不是规则。 -
对这种参数解析方式没有帮助,因为它被设计为在指南内工作;在sime意义上,帮助维护它们。
长选项,其参数通常与选项名称分隔为\-
,没有这个问题; getopts
显然是一个值,而=
显然是--long=-a
,没有值,后跟选项--long -a
。