跳过导航链接 | |
退出打印视图 | |
![]() |
手册页第 1 部分:用户命令 Oracle Solaris 11.1 Information Library (简体中文) |
- 解析实用程序选项
/usr/bin/getopts optstring name [arg...]
getopts optstring name [argument]...
getopts optstring name [arg]...
getopts [-a name] optstring name [arg]...
getopts 实用程序可用于从参数列表中检索选项和选项参数。
每次被调用时,getopts 实用程序都会将下一选项的值放入 name 操作数指定的 shell 变量中,将要处理的下一参数的索引放入 shell 变量 OPTIND 中。每当调用 shell 时,OPTIND 都将初始化为 1。
如果某个选项需要选项参数,getopts 实用程序会将其放置在 shell 变量 OPTARG 中。如果未找到选项,或找到的选项没有选项参数,则取消设置 OPTARG。
如果在需要选项字符的位置发现了 optstring 操作数中未包含的选项字符,由 name 指定的 shell 变量将设置为问号 ( ? ) 字符。在此情况下,如果 optstring 中的第一个字符是冒号 (:),则 shell 变量 OPTARG 将设置为所找到的选项字符,但不会有任何输出写入到标准错误;其他情况下,将取消设置 shell 变量 OPTARG 并将一条诊断信息写入到标准错误。此情况将被视为在将参数提供给调用应用程序时检测到的错误,而不是 getopts 处理中的错误。
如果缺少某个选项参数:
如果 optstring 的第一个字符是冒号,则由 name 指定的 shell 变量将设置为冒号字符,shell 变量 OPTARG 将设置为找到的选项字符。
其他情况下,由 name 指定的 shell 变量设置为问号字符 (?),将取消设置 shell 变量 OPTARG,并且会将一条诊断消息写入标准错误。此情况将被视为在将参数提供给调用应用程序时检测到的错误,而不是 getopts 处理中的错误;诊断消息将编写为有状态的,但退出状态为零。
当遇到选项结尾时,getopts 实用程序将以一个大于零的返回值退出;shell 变量 OPTIND 将设置为第一个非选项参数的索引(如果第一个 - - 参数之前没有其他非选项参数出现,则会将该参数视为选项参数)或设置为值 $# + 1(如果没有非选项参数);name 变量将设置为问号符号。以下任意项都表示选项的结尾:特殊选项 - -,发现未以 - 开头的参数,或遇到错误。
shell 变量 OPTIND 和 OPTARG 对于 getopts 的调用者而言是本地的,且缺省情况下不会导出。
由 name 操作数指定的 shell 变量、OPTIND 和 OPTARG 会影响当前的 shell 执行环境。
如果应用程序将 OPTIND 设置为值 1,则可使用一个新的参数集:当前的位置参数或新的 arg 值均可。对于尝试在单个 shell 执行环境中多次调用 getopts 的其他情况,如果所使用的参数(位置参数或 arg 操作数)不是在所有调用中都相同,或者使用了修改为非 1 值的 OPTIND 值,则会产生意外的结果。
getopts 是一个内置 Bourne shell 命令,用于解析位置参数和检查有效选项。请参见 sh(1)。它支持命令语法标准的所有适用规则(请参见 Intro(1) 中的规则 3 至 10)。应该使用该命令来替代 getopt 命令。
optstring 必须包含使用 getopts 的命令可以识别的选项字母。如果某个字母后面跟有冒号,则该选项需要有一个参数或一组参数,必须使用空格将其与参数隔开。
每次被调用时,getopts 会将下一个选项放在 shell 变量 name 中,将下一个要处理的参数的索引放在 shell 变量 OPTIND 中。只要调用 shell 或 shell 脚本,就会将 OPTIND 初始化为 1。
如果某个选项需要选项参数,getopts 会将其放置在 shell 变量 OPTARG 中。
如果遇到非法选项,会将 ? 放置在 name 中。
当遇到选项的结尾时,getopts 将以非零退出状态退出。可使用特殊选项 – 来限定选项的结尾。
缺省情况下,getopts 解析位置参数。如果在 (argument . . .) getopts 命令行上指定了额外的参数 (argument ., . .),getopts 将改而对它们进行解析。
/usr/lib/getoptcvt 读取 filename 中的 shell 脚本,将其转换为使用 getopts 而不是 getopt,然后在标准输出中写入结果。
这样,所有新命令将遵循 Intro(1) 中介绍的命令语法标准,它们应该使用 getopts 或 getopt 来解析位置参数和检查对该命令有效的选项。
如果 getopts 遇到不包括在 optstring 中的选项字母,将会在标准错误上输出一条错误消息。
尽管在当前实现中,允许放宽以下命令语法规则(请参见 Intro(1)),但也不应使用这些语法规则,因为系统的将来发行版可能不支持它们。如下面的“示例”部分所示,-a 和 -b 均为选项,选项 - o 需要一个选项参数。
以下示例违反了规则 5:具有选项参数的选项不得与其他选项组合在一起:
example% cmd -aboxxx filename
以下示例违反了规则 6:在接受选项参数的选项后面必须有空格:
example% cmd -ab oxxx filename
更改 shell 变量 OPTIND 的值或解析不同的参数集合可能会导致意外结果。
检查 arg 是否具有合法选项。如果省略了 arg,则会使用位置参数。选项参数以 + 或 - 开头。未以 + 或 - 开头的选项或者参数 – 表示选项的结尾。optstring 包含 getopts 可识别的字母。如果字母后面跟有一个 :,则该选项需要有一个参数。选项与参数之间可以用空格隔开。
每次在有前缀 + 的情况下被调用时,如果 arg 以 + 开头,则 getopts 会将它发现的下一个选项字母放置在变量 name 中。下一个 arg 的索引存储在 OPTIND 中。选项参数(如果有)存储在 OPTARG 中。
optstring 中的前导 : 将导致 getopts 将无效选项的字母存储在 OPTARG 中,并针对未知选项将 name 设置为 ?,而在缺少某个必需的选项时将 name 设置为 :。其他情况下,getopts 将显示一条错误消息。如果没有更多选项,则退出状态是非零的。
getopts 支持传统的单字符短选项和由 Sun 的命令行接口范例 (Command Line Interface Paradigm, CLIP) 定义的长选项。
每个长选项都是短选项的别名,是在紧跟在其等效短选项后的括号中指定的。例如,可以使用以下脚本行将长选项 file 指定为短选项 f 的别名:
getopts "f(file)" opt
在命令行上,请在长选项之前加上前缀 -- 或 ++。在上面的示例中,命令行上的 --file 等同于 -f,而命令行上的 ++file 等同于 +f。
每个短选项可以有多个长选项等效体,但是这有违 CLIP 规范,应谨慎使用。必须将每个长选项等效体都放置到括号中,如下所示:
getopts "f:(file)(input-file)o:(output-file)"
在上面的示例中,--file 和 --input-file 均等同于 -f,而 --output-file 等同于 -o。
变量 name 始终设置为短选项。当在命令行上指定长选项时,name 将被设置为其短选项等效体。
有关 Korn shell 的 getopts 内置命令的进一步讨论,请参见本手册页中之前 Bourne shell (sh) 部分中的讨论。
getopts 实用程序可用于从 arg 指定的参数列表或从位置参数(如果省略了 arg)检索选项和参数。它还可以基于 optstring 中的信息为命令生成用法消息和手册页。
每次被调用时,getopts 实用程序都会将下一选项的值放入 name 操作数指定的 shell 变量中,将要处理的下一参数的索引放入 shell 变量 OPTIND 中。当调用 shell 时,OPTIND 将初始化为 1。当选项需要或允许选项参数时,getopts 会将选项参数置于 shell 变量 OPTARG 中。其他情况下,OPTARG 将设置为 1(当设置了该选项时)或 0(当取消设置该选项时)。
optstring 字符串包含字母数字字符、特殊字符 +、-、?、: 以及空格或括在 [...] 中的字符组。字符组可以嵌套在 {...} 中。在 [...] 组以外,后跟零个或多个空格的单个 NEWLINE 将被忽略。一个或多个空白行将选项与命令参数概要隔开。
每个 [...] 组包含一个可选标签、由 : 分隔的可选属性以及跟在 ? 后面的可选描述字符串。对于选项解析和简短用法消息,从 ? 到下一个 ] 结尾之间的字符将被忽略。它们用于生成详细帮助或手册页。: 字符不能出现在标签中。? 字符在标签中必须指定为 ??,] 字符在描述字符串中必须指定为 ]]。文本位于两个 \b (backspace) 字符之间表示该文本在显示时应使用粗体。文本位于两个 \a (bell) 字符之间表示该文本在显示时应进行强调或使用斜体。文本位于两个 \v (vertical tab) 字符之间表示该文本应以定宽字体显示。位于两个 \f (form feed) 字符之间的文本将由其名称是被围文本的 shell 函数的输出替换。
此接口的所有输出都将写入到标准错误。
有多种组类型:
格式为
[-[version][flag[number]]...[?text]]
的组,作为第一个组出现,用以启用扩展的接口。
version 指定接口版本,目前为 1。若省略版本,则将使用最新版本。将来的增强可能会递增 version,但所有版本均受支持。text 通常指定一个 SCCS 或 CVS 标识字符串。可以指定零个或多个带有可选数值的标志来控制选项解析。这些标志包括:
格式为 [ option[!][=number ][:longname][? text]] 的选项规范。在此情况下,第一个字段是选项字符,是当选项匹配时在 name 操作数中返回的值。如果没有选项字符,则应当指定两个或多个数字。如果长选项匹配,该数字将返回为 name 操作数的值。如果选项后跟有一个 !,则选项字符的意思将是 longname 意思的反义。对于不接受值的选项,对于 ! 反义的选项字符,OPTARG 将设置为 0,其他情况下将设置为 1。 =number 是可选的,它指定要在 name 操作数中返回一个数字而不是返回选项字符。longname 是由 --longname 指定的,并与所有长选项的最短非二义性前缀匹配。longname 字段中的 * 表示仅截至到此点的字符需要匹配,并假定任何其他字符完全匹配。对于没有 longname 或描述性文本的选项,最外层的 [ 和 ] 可以省略。
选项参数规范。接受参数的选项的后面可以跟有 :(指示字符串值)或 #(指示数字值),以及选项参数规范。选项参数规范由选项参数名称(如 field 1)组成。其余由 : 分隔的字段是类型名和特殊属性词 listof、oneof 和 ignorecase 中的零个或多个。缺省选项值可以在最后的字段中指定为 :=default。选项参数规范的后面可以跟有用大括号括起的选项值描述列表。接受参数的长选项将指定为 --longname= value。 如果 : 或 # 后跟有 ?,则选项参数是可选的。如果仅指定了选项字符格式,且下一个参数以 - 或 + 开头,则不会设置可选参数值。
选项值描述。
参数规范。可以通过将有效选项参数值括在选项参数规范后的 {...} 内来指定有效选项参数值的列表。每个允许的值可以使用 [...](在其中包含值以及跟在值后的描述)来指定。
[+\ n...] 格式的组,以定宽字体显示代表 ... 的字符且不换行。
[+name ?text] 格式的组,指定节名称与描述性文本。如果省略了 name,则会将 text 置于新段落中。
[-name ?text] 格式的组,指定实现部分的条目。
如果 optstring 的前导字符是 +,则以 + 开头的参数也将被视为选项。
optstring 中的前导 : 字符或跟随在前导 + 后的 : 字符会影响错误的处理方式。如果在处理选项时遇到 optstring 中未指定的选项字符或 longname 参数,则其名称是 name 的 shell 变量将设置为 ? 字符。shell 变量 OPTARG 将设置为找到的字符。如果某个选项参数缺失或具有无效值,则 name 将设置为 : 字符,shell 变量 OPTARG 将设置为找到的选项字符。若无前导 :,在遇到错误时,name 将设置为 ? 字符,OPTARG 将取消设置,且会将一条错误消息写入到标准错误。
以下任一情况都表示选项的结尾:
遇到特殊参数 --。
遇到未以 - 开头的参数。
指定了帮助参数。
遇到了错误。
如果 OPTIND 设置为值 1,则可以使用新的参数集合。
getopts 还可用于生成帮助消息,其中包含命令用法和详细的描述。将 args 指定为:
这用来生成用法概要。
这用来生成详细的用法消息。
这用来生成格式化的手册页。
这用来生成易于解析的用法消息。
这用来生成 html 格式的手册页。
这用来生成 nroff 格式的手册页。
这用来列出当前的 optstring。
这用来列出 version=n,其中 n 大于 0(如果 getopts 可以识别选项 name)。
当遇到选项结尾时,getopts 将以非零返回值退出,变量 OPTIND 将设置为第一个非选项参数的索引。
ksh 支持以下选项:
使用 name 而不是用法消息中的命令名称。
支持下列操作数:
一个包含调用 getopts 的实用程序可识别的选项字符的字符串。如果某个字符后跟有一个冒号,则该选项需要有一个参数,该参数应作为单独的参数提供。应用程序应将选项字符及其选项参数指定为单独的参数,但 getopts 会将跟随在需要参数的选项字符后的字符解释为参数,无论实际情况是否如此。在调用 getopts 时,如果显式的空选项参数不是作为单独的参数提供的,则无需识别该参数;请参见getopt(3C)。应用程序不得使用问号字符 (?) 和冒号字符 (:) 作为选项字符。使用非字母数字的其他选项字符会产生意外结果。如果选项参数不是作为与选项字符隔开的参数提供的,则 OPTARG 中的值会被除去选项字符和 -。optstring 中的第一个字符决定了当某个选项字符未知或缺少某个选项参数时 getopts 的行为。
shell 变量的名称,由 getopts 实用程序设置为发现的选项字符。
缺省情况下,getopts 实用程序解析传递到调用方 shell 过程的位置参数。如果指定了 arg,则将解析这些参数而不解析位置参数。
因为 getopts 会影响当前的 shell 执行环境,因此,它通常是作为 shell 常规内置项提供的。如果它是在一个子 shell 或单独的实用程序执行环境中调用的,例如下面所示的环境之一:
(getopts abc value "$@") nohup getopts ... find . -exec getopts ... \;
则它不会影响调用者的环境中的 shell 变量。
请注意,尽管位置参数已更改,但 shell 函数与调用方 shell 共享 OPTIND。想使用 getopts 来解析参数的函数通常希望将 OPTIND 的值保存在条目上并在返回之前对其进行还原。然而,有时候函数希望为调用方 shell 更改 OPTIND。
示例 1 解析并显示参数
以下示例脚本将解析并显示其参数:
aflag= bflag= while getopts ab: name do case $name in a) aflag=1;; b) bflag=1 bval="$OPTARG";; ?) printf "Usage: %s: [-a] [-b value] args\n" $0 exit 2;; esac done if [ ! -z "$aflag" ]; then printf "Option -a specified\n" fi if [ ! -z "$bflag" ]; then printf 'Option -b "%s" specified\n' "$bval" fi shift $(($OPTIND - 1)) printf "Remaining arguments are: %s\n" "$*"
示例 2 为带选项的命令处理参数
以下 shell 程序片段为可以接受选项 -a 或 -b 的命令处理参数。它还将处理选项 -o,该选项需要一个选项参数:
while getopts abo: c do case $c in a | b) FLAG=$c;; o) OARG=$OPTARG;; \?) echo $USAGE exit 2;; esac done shift `expr $OPTIND - 1`
示例 3 等效的代码表达式
此代码示例将下列各个输入视为等效的:
cmd -a -b -o "xxx z yy" filename cmd -a -b -o "xxx z yy" -- filename cmd -ab -o xxx,z,yy filename cmd -ab -o "xxx z yy" filename cmd -o xxx,z,yy -b -a filename
有关影响 getopts 执行的以下环境变量的描述,请参见 environ(5):LANG、LC_ALL、LC_CTYPE、LC_MESSAGES 和 NLSPATH。
getopts 将该变量用作要处理的下一个参数的索引。
如果某个选项使用了参数,getopts 将使用该变量来存储参数。
将返回以下退出值:
找到了一个选项,可能是也可能不是由 optstring 指定的。
遇到选项的结尾,或发生错误。
ksh 返回以下退出值:
找到指定的选项。
遇到选项结尾。
已生成用法或信息性消息。
有关下列属性的说明,请参见 attributes(5):
|
|
Intro(1)、getoptcvt(1)、ksh(1)、ksh88(1)、ps(1)、sh(1)、getopt(3C)、attributes(5)、environ(5)、standards(5)
无论何时检测到错误,如果 optstring 操作数中的第一个字符不是冒号 (:),则都会向标准错误写入一条诊断消息,其中以未指定格式包含以下信息:
消息中标识了调用方程序的名称。调用方程序名称是调用 getopts 实用程序时 shell 特殊参数 0 的值。可以使用
basename "$0"
的名称等效体。
如果发现了未在 optstring 中指定的某个选项,则会在消息中标识该错误并标识无效的选项字符。
如果发现了需要选项参数的某个选项,但未发现选项参数,则会在消息中标识该错误并标识无效的选项字符。