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

问题描述

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

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

这与以下有何不同:

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

解决方法

这与以下有何不同:

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

选择字符串

一个包含调用 getopts 的实用程序识别的选项字符的字符串。 [...]

字符 不应被应用程序用作选项字符。 [...]

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

作者很可能打算做“可选选项参数” - getopt 不支持这样的功能(如果支持,我相信它会像在 GNU {{ 1}}).

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

?