在bash中使用getopts的布尔cli标志?

foo*_*100 8 bash command-line-interface getopts

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

Urs*_*aDK 9

当然这是可能的。@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
Run Code Online (Sandbox Code Playgroud)

关于上述示例的一些注意事项:

  • truefalse用作选项 x 指示符,因为它们都是有效的 UNIX 命令。在我看来,这使得对选项存在的测试更具可读性。

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

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

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

有关更多信息,getopts请参阅Bash Hackers Wiki:Small getopts 教程