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 内部变量。