getopts 的选项字符串的第一个字符是 :(冒号)的目的是什么?

Tim*_*Tim 9 bash getopts

在使用时的选项字符串中getopts,来自http://wiki.bash-hackers.org/howto/getopts_tutorial

如果选项字符串的第一个字符是 :(冒号),这通常是无意义的,因为它前面没有选项字母,getopts 会切换到“静默错误报告模式”。在生产脚本中,这通常是您想要的,因为它允许您自己处理错误而不会被烦人的消息打扰。

我想知道以下是什么意思:

  • “静默错误报告模式”

  • “它允许您自己处理错误而不会被烦人的消息打扰”?

你能举一些例子吗?

Kus*_*nda 9

如果第一个字符optstring是冒号,getopts则不会为缺少选项参数或无效选项生成任何诊断消息。

如果您确实需要更多地控制脚本生成的诊断消息,或者如果用户提供了奇怪的命令行选项,您根本不希望在标准错误流中出现任何内容,这可能很有用。

在静默报告模式下(带有初始:),如果您想提醒用户无效选项,则必须?在传递给 的变量中查找getopts。同样,对于缺少的选项参数,它是一个:. 这是通常由getopts自己处理的两个错误,但是要向用户报告自己的错误,您需要分别捕获它们才能给出正确的诊断消息。

在非静默报告模式下,getopts对标准错误进行自己的错误报告,您只需要捕获*“任何错误”。

比较这两个例子:

#!/bin/bash

while getopts 'a:b:' opt; do
    case "$opt" in
        a) printf 'Got a: "%s"\n' "$OPTARG" ;;
        b) printf 'Got b: "%s"\n' "$OPTARG" ;;
        *) echo 'some kind of error' >&2
           exit 1
    esac
done
Run Code Online (Sandbox Code Playgroud)

*案例捕获任何类型的命令行解析错误。

$ bash script.sh -a
script.sh: option requires an argument -- a
some kind of error
$ bash script.sh -c
script.sh: illegal option -- c
some kind of error
Run Code Online (Sandbox Code Playgroud)
#!/bin/bash

while getopts ':a:b:' opt; do
    case "$opt" in
        a)  printf 'Got a: "%s"\n' "$OPTARG" ;;
        b)  printf 'Got b: "%s"\n' "$OPTARG" ;;
        :)  echo 'missing argument!' >&2
            exit 1 ;;
        \?) echo 'invalid option!' >&2
            exit 1
    esac
done
Run Code Online (Sandbox Code Playgroud)

:上面的case 捕获缺少参数错误,而?case 捕获无效选项错误(请注意,?需要转义或引用以匹配文字?,否则它会匹配任何单个字符)。

$ bash script.sh -a
missing argument!
$ bash script.sh -b
missing argument!
$ bash script.sh -c
invalid option!
Run Code Online (Sandbox Code Playgroud)