检查脚本的第一个参数是否为 -e 或 -d

检查脚本的第一个参数是否为 -e 或 -d

我现在正在编写一个 bash shell 脚本,其中一个规范是,如果第一个参数 $1 不是 -e 或 -d,我需要打印一条错误消息,这就是我所做的:

if [ "$1" != "-e" ] || [ "$1" != "-d" ]; then
        echo "Error: First argument must be either -e or -d"
        exit 1
fi

然而,这似乎不起作用,因为即使我使用 -e 或 -d 作为第一个参数,仍然会打印此错误消息。我做错了什么以及如何解决这个问题?

答案1

如果$1-d,则第一个条件为真。如果$1-e,则第二个条件为真。如果有其他的话,两者都是真的。自从你加入他们以来||或者), 这然后的分支如果如果任一为真,则采用。因此,然后分支总是被占用。

您需要if [ "$1" != "-e" ] && [ "$1" != "-d" ]使用然后$1仅当不是时才分支-e 不是-d

答案2

case $1 in
    -d) ;; # nothing to do
    -e) ;; # nothing to do
    *)
        echo 'Error: First argument must be either -e or -d' >&2
        exit 1
esac

这将触发exit 1if是or$1以外的任何内容。-d-e

或者,根据使用的选项和对其执行的操作设置一个标志(我倾向于将其分开解析命令行选项来自表演在他们):

case $1 in
    -d) dflag=1 ;;
    -e) dflag=0 ;;
    *)
        echo 'Error: First argument must be either -e or -d' >&2
        exit 1
esac

# Getting here means:
#     - $1 was either -d or -e
#     - $dflag will show which one it was

if [ "$dflag" -eq 1 ]; then
    # act on -d option
else
    # act on -e option
fi

作为ilkkachu已经阐明了,您的问题(除了缺少的双引号)是逻辑之一(布尔运算)。上面,我只是展示了另一种执行操作的方法。case...esac语句通常用于处理命令行选项。

相关内容