在Bash中使用getopts实现布尔型命令行标志?

9

在bash中,是否可以使用getopts实现布尔型cli选项?基本上,如果指定了-x,我想做一件事情,如果没有指定就做另一件事情。


搜索 "[bash] getopts case",祝你好运。 - shellter
1
getopts循环之前设置变量:opt_x ="";,在getopts循环内部的case中设置opt_x="-x"。循环结束后测试$opt_x的值。如果愿意,您可以使用opt_x="no"opt_x="yes"或任何其他约定。请参考Shell脚本模板中的vflag来了解另一种约定。 - Jonathan Leffler
1个回答

12

当然是可能的。@JonathanLeffler在问题的评论中已经基本给出了答案,所以我在这里要做的就是添加一个实现的示例和一些需要考虑的细节:

#!/usr/bin/env bash

# Initialise option flag with a false value
OPT_X='false'

# Process all options supplied on the command line 
while getopts ':x' 'OPTKEY'; do
    case ${OPTKEY} in
        'x')
            # Update the value of the option x flag we defined above
            OPT_X='true'
            ;;
        '?')
            echo "INVALID OPTION -- ${OPTARG}" >&2
            exit 1
            ;;
        ':')
            echo "MISSING ARGUMENT for option -- ${OPTARG}" >&2
            exit 1
            ;;
        *)
            echo "UNIMPLEMENTED OPTION -- ${OPTKEY}" >&2
            exit 1
            ;;
    esac
done

# [optional] Remove all options processed by getopts.
shift $(( OPTIND - 1 ))
[[ "${1}" == "--" ]] && shift

# "do one thing if -x is specified and another if it is not"
if ${OPT_X}; then
    echo "Option x was supplied on the command line"
else
    echo "Option x was not supplied on the command line"
fi

关于上面的例子,有几点需要注意:

  • truefalse作为选项x的指示符号,因为两者都是有效的UNIX命令。在我看来,这样使对选项存在性的测试更可读。

  • getopts被配置为以静默错误报告模式运行,因为它抑制了默认的错误消息,并允许更精确的错误处理。

  • 该示例包括用于处理缺少选项参数和post-getopts命令行参数的代码片段。这些不是OP问题的一部分。

    它们是为了完整性而添加的,因为在任何相当复杂的脚本中都需要此代码。

有关getopts的更多信息,请参见Bash Hackers Wiki:小型getopts教程


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接