在我的操作系统中显示
bash
和 getopt
版本:
bash --version |grep [r]elease
GNU bash, version 5.2.15(1)-release (x86_64-pc-linux-gnu)
getopt --version
getopt from util-linux 2.38.1
在 getopt 的手册(man getopt 的 PARSING 部分)中,它说“一个简单的短选项是一个 '-' 后跟一个短选项字符。如果选项有必需的参数,可以直接写在选项字符之后或作为下一个参数(即,在命令行上用空格分隔)。如果选项有可选参数,则必须将其直接写在选项字符(如果存在)之后。”
vim test.sh
arg="b is B by default"
TEMP=$(getopt -o b:: -- "$@")
echo "$TEMP"
eval set -- "$TEMP"
while true; do
case "$1" in
-b)
arg="$2"
shift 2;;
--)
shift
break;;
esac
done
if [ "$arg" == "b is B by default" ];then
echo "$arg"
else
echo "b is $arg"
fi
显示选项的行为
-b
:
bash test.sh
b is B by default
bash test.sh -bc
b is c
bash test.sh -b c
b is
bash test.sh -b c
输出b is
,符合规则:If the option has an optional argument, it must be written directly after the option character if present.
现在我将
getopt -o b:: -- "$@"
重写为getopt -o :b: -- "$@"
。
vim test.sh
arg="b is B by default"
TEMP=$(getopt -o :b: -- "$@")
echo "$TEMP"
eval set -- "$TEMP"
while true; do
case "$1" in
-b)
arg="$2"
shift 2;;
--)
shift
break;;
esac
done
if [ "$arg" == "b is B by default" ];then
echo "$arg"
else
echo "b is $arg"
fi
显示选项的行为
-b
:
bash test.sh
b is B by default
bash test.sh -bc
b is c
bash test.sh -b c
b is c
为什么
getopt -o :b: -- "$@"
可以让bash test.sh -b c
输出b is c
?:b:
违反默认规则,:b:
中第一个冒号是什么意思?getopt如何解析:b:
?
您必须深入研究 getopt(3)
函数的手册页才能了解
optstring
的完整行为。对于
b::
:
两个冒号表示一个选项带有一个可选参数;如果当前 argv 元素中有文本(即与选项名称本身相同的单词,例如“-oarg”),则将其返回到 optarg 中,否则 optarg 将设置为零。 这是一个 GNU 扩展。这就是为什么你会得到
-b c
的空白参数; c 是一个不同的词,不用作参数。对于前冒号:
如果 optstring 的第一个字符(跟在上述任何可选的“+”或“-”之后)是冒号(“:”),则在您的示例中,您没有执行任何操作来触发前导冒号的特殊行为。不过,它确实演示了选项字母后单个冒号的行为。
getopt()
同样不会打印错误消息。 此外,它返回“:”而不是“?”指示缺少的选项参数。 这允许调用者区分两种不同类型的错误。