跳过导航链接 | |
退出打印视图 | |
![]() |
手册页第 1 部分:用户命令 Oracle Solaris 11.1 Information Library (简体中文) |
- 转换到 getopts 以解析命令选项
/usr/lib/getoptcvt [-b] filename
/usr/lib/getoptcvt
/usr/lib/getoptcvt 读取 filename 中的 shell 脚本,将其转换为使用 getopts 而不是 getopt,然后在标准输出中写入结果。
getopts 是一个内置 Bourne shell 命令,用于解析位置参数和检查有效选项。请参见 sh(1)。它支持命令语法标准的所有适用规则(请参见 Intro(1) 中的规则 3 至 10)。应该使用该命令来替代 getopt 命令。(请参见下文的“附注”部分。)shell 的内置 getopts 命令的语法为:
getopts optstring name [ argument . . . ]
optstring 必须包含使用 getopts 的命令可以识别的选项字母;如果字母后面跟有冒号 (:),则该选项需要有一个参数,或一组参数,必须使用空格将其与参数分隔。
每次被调用时,getopts 会将下一个选项放在 shell 变量 name 中,将下一个要处理的参数的索引放在 shell 变量 OPTIND 中。只要调用 shell 或 shell 脚本,就会将 OPTIND 初始化为 1。
如果某个选项需要选项参数,getopts 会将其放置在 shell 变量 OPTARG 中。
如果遇到非法选项,会将 ? 放置在 name 中。
当遇到选项的结尾时,getopts 将以非零退出状态退出。可以使用特殊选项 -- 来限定选项的结尾。
缺省情况下,getopts 解析位置参数。如果在 (argument . . .) getopts 命令行上指定了额外的参数 (argument . . .),getopts 改而对它们进行解析。
这样,所有新命令将遵循 Intro(1) 中介绍的命令语法标准,它们应该使用 getopts 或 getopt 来解析位置参数和检查对该命令有效的选项(请参见下文的“附注”部分)。
支持以下选项:
使转换的脚本可移植到 UNIX 系统的早期发行版。/usr/lib/getoptcvt 修改 filename 中的 shell 脚本,使得在执行所得到的 shell 脚本时,由它在运行时确定是调用 getopts 还是 getopt。
示例 1 为命令处理参数
以下 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`
示例 2 等效的代码表达式
此代码将下列各个输入视为等效的:
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 执行的环境变量 LC_CTYPE、LC_MESSAGES 和 NLSPATH 的描述,请参见 environ(5)。
getoptcvt 将该变量用作要处理的下一个参数的索引。
如果某个选项使用了参数,getoptcvt 将使用该变量来存储参数。
将返回以下退出值:
找到了一个选项,可能是也可能不是由 optstring 指定的。
遇到选项的结尾,或发生错误。
有关下列属性的说明,请参见 attributes(5):
|
Intro(1)、getopts(1)、sh(1)、shell_builtins(1)、getopt(3C)、attributes(5)
如果 getopts 遇到不包括在 optstring 中的选项字母,将会在标准错误上输出一条错误消息。
尽管在当前实现中,允许以下命令语法规则(请参见 Intro(1))放宽,但也不应使用这些语法规则,因为系统的将来发行版可能不支持它们。如上面的“示例”部分所示,-a 和 -b 均为选项,选项 -o 需要一个选项参数。以下示例违反了规则 5:具有选项参数的选项不得与其他选项组合在一起:
example% cmd -aboxxx filename
以下示例违反了规则 6:在接受选项参数的选项后面必须有空格:
example% cmd -ab oxxx filename
更改 shell 变量 OPTIND 的值或解析不同的参数集合可能会导致意外结果。