我有以下脚本:
#!/bin/bash
USER="NONE"
LOST=0
AVG=0
while getopts ":pmu:" OPTION; do
case $OPTION in
u)
USER=$OPTARG
;;
p)
LOST=1
;;
m)
AVG=1
;;
\?)
echo "Invalid argument: -$OPTARG"
exit 1
;;
:)
echo "-$OPTARG requires an argument."
exit 1
;;
esac
done
echo "$USER-$LOST-$AVG"
exit 0
我希望-u
选项接受一个参数。该脚本正确识别无效选项,并在没有参数的情况下调用-u
。但不幸的是,当我输入:
myscript -u -m -p
打印:
-m-1-0
因此,它使用-m
作为-u
参数,并忽略-m
选项本身。
答案 0 :(得分:2)
你告诉getopts
-u
选项之后是一个选项参数。 -m
是一个字符串值;它以-
符号开头的事实对于它作为选项参数的状态并不重要;您可以在选项参数值的开头使用-
。
所以,你的观察是正确的。这是预期的设计;这是getopt()
函数的工作方式,它是POSIX Utility Syntax Guidelines的实现 - 实际上是这些指南的略微宽松的版本。如果您不喜欢它,请使用getopts
以外的其他内容,但您将与系统作斗争。
请注意,尽管POSIX getopt()
在理论上允许“可选的选项 - 参数”,但实际上,只有命令行上的最后一个选项可以有一个可选的选项参数,这使它们基本上无用。
完全可以设计出行为不同且基本满足效用语法指南的选项解析系统;很多人都做到了。实际上,GNU getopt
程序是一个扩展实现,很可能是你应该看到的 - 但它有一个非常不同的调用来实现这种行为(另见Using getopts
in bash shell script to get long and short command line options)。系统都是不同的,并且通常简洁地描述所需的选项处理行为通常是复杂的。有关详细信息,请参阅Solaris CLIP — Command Line Interface Paradigm * 。
* Google搜索字词'solaris clip'为您提供电影'Solaris'的电影剪辑。工作搜索术语是“Solaris命令行界面范例”。