为什么脚本在 getopts 的 OptionString 中会有多个问号

Why would a script have multiple questions marks in the OptionString of getopts

我有一个包含以下行的脚本:

while getopts "b:?1:?2:?g:r:n:t:?o:?" opt; do

这与以下有何不同:

while getopts "b:1:2:g:r:n:t:o:" opt; do

how is this any different than:

第一个无效。它是不同的,因为 ? 很可能会被大多数 getopts 实现忽略,但是如果 getopts 决定在无效的 optstring 上出错,那会很好。来自 posix getopts:

optstring

A string containing the option characters recognized by the utility invoking getopts. [...]

The characters <question-mark> and <colon> shall not be used as option characters by an application. [...]

除错误处理外,没有提及 ?getopt 是一个非常简单的实用程序,? 在解析错误的情况下由 getopt 返回。

作者很可能打算做“可选选项参数”- getopt 不支持此类功能(如果支持,我相信它会像 GNU 中那样用两个 :: 表示getopt).

查看 bash sources getopt.cbash 使用简单的 strchr 扫描 optstring 中的选项。因为有 ?,它被解释为一个选项 - 区分错误和成功变得不可能(或不必要的困难),因为在出​​现错误时返回 ?

$ OPTIND=0; set -- -'?' -g; while getopts "something:?does_not_matter" opt; do echo "$opt" "$OPTARG"; done
?                                              # This is valid -? option
bash: option requires an argument -- g
?                                              # This is error

$ OPTIND=0; set -- -'?'; while getopts "something:does_not_matter" opt; do echo "$opt" "$OPTARG"; done
bash: illegal option -- ?
?                                              # This is error