为什么脚本在 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.c,bash
使用简单的 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
我有一个包含以下行的脚本:
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.c,bash
使用简单的 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