Bash - 需要可选参数但不传递以在getopts中使用

时间:2015-05-24 05:25:31

标签: bash shell 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)

2 个答案:

答案 0 :(得分:2)

如果失败,getopts会将OPTION设置为问号(?)。您应该将它添加到您的case语句中。如上所述,这是一个shell globbing字符,需要转义。

getoptsbash的内置功能。除了检查明确的?字符外,您还可以使用 Using getopts in bash shell script to get long and short command line options 中提到的bash变量OPTERR

查找此信息的最佳位置在bash的文档中。奇怪的是(考虑到bash中的扩展数量),它位于标题为 4.1 Bourne Shell Builtins 的部分中,确实有一个POSIX getopts供参考。但是,OPTERR变量是bash extension

答案 1 :(得分:2)

这里有几点:

# 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 "$0: -$OPTARG needs a value" >&2; 
            exit 2 
            ;;
        \?) echo "$0: unknown option -$OPTARG" >&2; 
            exit 3
            ;;
    esac
done

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

如果未向选项提供值,则OPTION设置为:。不幸的是,如果有人这样做,这没有任何帮助:

./x -t -h

因为-h将被视为选项OPTARG的{​​{1}}。因此额外的测试。

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

使用您的示例:

exit