49. getopts
在 shell 脚本中使用getopts
来获取调用脚本时键入的命令行选项。 您可以传递带或不带任何参数的选项。
请注意,getopt 与 getopts 不同。 getopt 是位于/usr/bin
下的外部程序,而 getopts 是 bash 内置程序。
然而,getopts 内置程序在功能上与 getopt 外部程序类似。
下面是一个将选项传递给 shell 脚本的简单用法示例:
script -c -v -f /tmp/1.sh -z
在上面的示例中,有 4 个选项(c
、v
、f
和z
)。
选项名称只能是单个字符。 选项 f
还有一个参数:/tmp/1.sh
您可以将多个选项组合在一起。 例如,c
、v
和z
选项可以组合为cvz
,如下所示。
script -cvz -f /tmp/1.sh
在 shell 脚本中,getopts 命令将使用以下语法:
getopts "optionstring" var [arguments]
"optionstring"
– 包含脚本可能期望的所有选项的列表。 对于上面的示例,选项字符串将为cvf:z
。 选项f
后面的冒号表示选项z
将有一个参数。var
– 将存储选项字符串的变量。arguments
– 处理给定的参数而不是位置参数。 这是可选的。
为了使getopts
正常工作,传递给脚本的每个单字符选项都应该以-
作为前缀。
当 bash 遇到没有连字符作为前缀的参数时,它会立即终止getopts
解析。
通常,您会将getopts
与while
和case
语句一起使用,如下例所示。
$ cat getopts.sh
while getopts ":cvf:z" Option
do
case $Option in
c ) echo -n "Option c is used. "
echo "OPTIND=$OPTIND"
;;
v ) echo -n "Option v is used. "
echo "OPTIND=$OPTIND"
;;
f ) echo -n "Option f is used. "
echo "OPTIND=$OPTIND OPTARG=$OPTARG"
;;
z ) echo -n "Option z is used. "
echo "OPTIND=$OPTIND"
;;
esac
done
shift $(($OPTIND - 1))
执行上面的getopts
示例 shell 脚本来查看输出。
$ ./getopts.sh -c -v -f /tmp/1.sh -z
Option c is used. OPTIND=2
Option v is used. OPTIND=3
Option f is used. OPTIND=5 OPTARG=/tmp/1.sh
Option z is used. OPTIND=6
在以下示例中,给出的第二个选项v
不带连字符(-
)。
因此,getopts
仅处理第一个选项 (-c
) 并停止。
$ ./getopts.sh -c v -f /tmp/1.sh -z
Option c is used. OPTIND=2
选项字符串中的第一个冒号(:
)是可选的。 在上面的示例中,您还可以指定选项字符串,如下所示。
while getopts "cvf:z" Option
但是,当您将选项字符串中不存在的参数传递给脚本时,它将抛出错误消息。 因此,在前面使用冒号(:
)将不会显示该错误消息。
$OPTIND
指向它正在处理的当前选项。$OPTARG
包含该索引的参数。$OPTARG
和$OPTIND
都是 bash 内部变量。