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

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

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

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

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

  • “静默错误报告模式”

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

您能否举一些例子?

答案1

如果 的第一个字符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

案件*抓获任何一种命令行解析错误。

$ 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
#!/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

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

$ bash script.sh -a
missing argument!
$ bash script.sh -b
missing argument!
$ bash script.sh -c
invalid option!

答案2

非静默,getopts打印错误消息:

$ bash -c 'getopts a opt' getopts_test -b
getopts_test: illegal option -- b

静默,getopts不自行打印:

$ bash -c 'getopts :a opt' getopts_test -b
$

因此,使用用于静默模式的冒号,我们可以按照我们喜欢的方式在脚本中打印我们自己的错误,而不是固定消息:

#!/bin/bash
while getopts :a opt; do
    [[ $opt = "?" ]] && echo "Invalid option character '$OPTARG'" >&2;
done

相关内容