运行脚本时,防止同时使用两个标志

时间:2018-04-04 20:53:25

标签: bash shell flags getopts

我的script.sh用法:

./work.sh [options] parm_1 parm_2 parm_3 parm_4

选项:

-y year
-n number
-1 (flag, no parameters)
-2 (flag, no parameters)

我想在-1和-2标志之间互斥,所以如果指定-1,则不能使用-2并抛出错误而反之亦然 是否可以使用getopts实现这一点?

1 个答案:

答案 0 :(得分:2)

getopts是一个选项解析工具;它不处理逻辑和语义(选项的含义,必需的选项或禁止的组合等)。那些围绕getopts的代码(正如@Jens在评论中所建议的那样)。这是一个简单的例子:

# Default values:
flag1="false"    # Note: "false" is just a text string, this is a cheat.
flag2="false"    # See note at end.
year=2001
number=42    # because 42 is the correct default number

# Parse the supplied options
while getopts "y:n:12" OPT; do
    case "$OPT" in
        y)
            year=${OPTARG}
            ;;
        n)
            number=${OPTARG}
            ;;
        1)
            flag1="true"
            ;;
        2)
            flag2="true"
            ;;
        *)
            echo "Usage: $0 [-y year] [-n number] [-1|-2]" >&2
            exit 1
            ;;
    esac
done
shift $((OPTIND-1))

# Enforce rules about option combos
if $flag1 && $flag2; then
    echo "$0: The options -1 and -2 cannot be specified together." >&2
    exit 1
fi

这实际上只是getopts用于解析选项的bog标准调用,后面跟if语句强制执行-1和 - 2可以执行的规则一起使用。这就是它的全部内容。

请注意,我将flag1flag2视为布尔变量,但shell语法中确实没有这样的东西;他们实际上只是字符串。这恰好与命令相对应。这恰好在if语句中以半直观的方式工作。但这是一个骗子,所以不要将它们误认为真正的布尔变量。有关详细信息,请参阅here