• 本页内容

49. getopts


在 shell 脚本中使用getopts来获取调用脚本时键入的命令行选项。 您可以传递带或不带任何参数的选项。

请注意,getopt 与 getopts 不同。 getopt 是位于/usr/bin下的外部程序,而 getopts 是 bash 内置程序。 然而,getopts 内置程序在功能上与 getopt 外部程序类似。

下面是一个将选项传递给 shell 脚本的简单用法示例:

script -c -v -f /tmp/1.sh -z

在上面的示例中,有 4 个选项(cvfz)。 选项名称只能是单个字符。 选项 f还有一个参数:/tmp/1.sh

您可以将多个选项组合在一起。 例如,cvz选项可以组合为cvz,如下所示。

script -cvz -f /tmp/1.sh

在 shell 脚本中,getopts 命令将使用以下语法:

getopts "optionstring" var [arguments]
  • "optionstring" – 包含脚本可能期望的所有选项的列表。 对于上面的示例,选项字符串将为cvf:z。 选项f后面的冒号表示选项z将有一个参数。
  • var – 将存储选项字符串的变量。
  • arguments – 处理给定的参数而不是位置参数。 这是可选的。

为了使getopts正常工作,传递给脚本的每个单字符选项都应该以-作为前缀。 当 bash 遇到没有连字符作为前缀的参数时,它会立即终止getopts解析。

通常,您会将getoptswhilecase语句一起使用,如下例所示。

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