Bash - 需要可选参数但未传递用于 getopts

Bash - optional argument required but not passed for use in getopts

如何在需要参数的 bash 脚本中标记错误 对于getopt,但是用户没有通过?例如下面的脚本 需要选项 "t":

的参数
#!/bin/bash
while getopts "ht:" OPTION
do
    case $OPTION in
        h)
            echo "Hi"
            ;;
        t)
            echo You entered $OPTARG
            ;;
    esac
done

我想捕获以下错误并打印其他内容 出口。目前,它会继续评估更多的论点,而无需 退出。

$ ./x.sh -h -t aa     # (this is fine)
Hi
You entered aa

$ ./x.sh -h -t       # (this is not handled)
Hi
No arg for -t option      # (this error is being printed by bash)

失败时,getopts 将 OPTION 设置为问号 (?)。您应该将其添加到您的案例陈述中。如前所述,这是一个 shell 通配符,需要转义。

getoptsbash 的 built-in 特征。除了检查显式 ? 字符外,您还可以使用 bash 变量 OPTERR,如 Using getopts in bash shell script to get long and short command line options.[=23 中所述=]

查找此信息的最佳位置是在 bash 的文档中。奇怪的是(鉴于 bash 中的扩展数),它位于标题为 4.1 Bourne Shell Builtins, and indeed there is a POSIX getopts for reference. The OPTERR variable, however, is a bash extension.

的部分中

这里有几点:

# Note the leading ':'
while getopts :ht: OPTION
do
    case $OPTION in
        h)
            echo "Hi"
            ;;
        t)
            echo "You entered $OPTARG"
            if [[ ${OPTARG:0:1} == '-' ]]; then
                echo "Invalid value $OPTARG given to -$OPTION" >&2
                exit 1
            fi
            ;;
        :)  echo "[=10=]: -$OPTARG needs a value" >&2; 
            exit 2 
            ;;
        \?) echo "[=10=]: unknown option -$OPTARG" >&2; 
            exit 3
            ;;
    esac
done

选项列表中的前导“:”允许我们进行自己的错误处理。如果提供了未知选项,则 OPTION 将设置为 ?。请注意,在 case 语句中,它必须被转义(以 \ 为前缀),否则它将匹配任何单个字符。

如果未向选项提供值,则 OPTION 设置为 :。不幸的是,如果有人这样做,这无济于事:

./x -t -h

因为 -h 将被视为选项 -tOPTARG。因此额外的测试。

请注意,所有错误消息都会转到标准错误 (>&2)。要停止脚本的执行,我们使用 exit 后跟 0-255 范围内的数字。唯一具有特定含义的数字是零,这意味着成功。 1-255这几个数字,我们可以任意选择,但都是失败的意思。

使用你的例子:

./x.sh -t -h
You entered -h
Invalid value -h given to -t

./x.sh -h -t aa
Hi
You entered aa

./x.sh -h -t
Hi
./x.sh: -t needs a value

./x.sh -t tea -c
You entered tea
./x.sh: unknown option -c