getopt 命令行中“:b:”中的第一个冒号是什么意思?

问题描述 投票:0回答:1

在我的操作系统中显示

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:

bash arguments optional-parameters getopt
1个回答
0
投票

您必须深入研究 getopt(3)

 函数的 
手册页才能了解 optstring
 的完整行为。

对于

b::

两个冒号表示一个选项带有一个可选参数;如果当前 argv 元素中有文本(即与选项名称本身相同的单词,例如“-oarg”),则将其返回到 optarg 中,否则 optarg 将设置为零。 这是一个 GNU 扩展。

这就是为什么你会得到

-b c

 的空白参数; c 是一个不同的词,不用作参数。

对于前冒号:

如果 optstring 的第一个字符(跟在上述任何可选的“+”或“-”之后)是冒号(“:”),则

getopt()

 同样不会打印错误消息。  此外,它返回“:”而不是“?”指示缺少的选项参数。  这允许调用者区分两种不同类型的错误。

在您的示例中,您没有执行任何操作来触发前导冒号的特殊行为。不过,它确实演示了选项字母后单个冒号的行为。

© www.soinside.com 2019 - 2024. All rights reserved.