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

Posted

技术标签:

【中文标题】在 bash 中使用 getopts 的布尔 cli 标志?【英文标题】:Boolean cli flag using getopts in bash? 【发布时间】:2015-11-05 14:43:33 【问题描述】:

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

【问题讨论】:

搜索[bash] getopts case祝你好运。 是的;在getopts 循环之前设置一个变量:opt_x="";;在getopts 循环内的case 内设置opt_x="-x"。在循环之后测试$opt_x 中的值。如果您愿意,可以使用opt_x="no"opt_x="yes",或任何其他约定。观察在Shell script templates 中使用vflag 以获取另一个约定。 【参考方案1】:

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

#!/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 配置为在静默错误报告模式下运行,因为它抑制了默认错误消息并允许更精确的错误处理。

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

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

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

【讨论】:

以上是关于在 bash 中使用 getopts 的布尔 cli 标志?的主要内容,如果未能解决你的问题,请参考以下文章

在 Bash 中使用 getopts 检索单个选项的多个参数

如何在 bash 中使用 getopts 的示例

如何在 Bash 中使用 getopt 和长选项?

使用 getopts (bash) 的多个选项参数

如何在 bash 中结合 getopts 和位置参数? [复制]

在bash中使用getopts来获取可选的输入参数[重复]