将shell布尔条件与选择性优先级组合

将shell布尔条件与选择性优先级组合,shell,Shell,我在脚本开头有两个条件来验证参数。其目的是只传递两个参数,第一个参数必须是“FOO”或“BAR”。我下面的内容很有效,但我想知道如何将其作为单个if语句: #!/bin/bash if [ "$#" -ne 2 ]; then echo "Usage: $0 <FOO or BAR> <Removed for SO>" exit fi if [ "$1" != "FOO " -a "$1" != "BAR" ]; then

我在脚本开头有两个条件来验证参数。其目的是只传递两个参数,第一个参数必须是
“FOO”
“BAR”
。我下面的内容很有效,但我想知道如何将其作为单个if语句:

#!/bin/bash

if [ "$#" -ne 2 ]; then
        echo "Usage: $0 <FOO or BAR> <Removed for SO>"
        exit
fi
if [ "$1" != "FOO " -a "$1" != "BAR" ]; then
        echo "Usage: $0 <FOO or BAR> <Removed for SO>"
        exit
fi

您可以在两个条件之间使用
|

if [ "$#" -ne 2 ] || [ "$1" != "FOO" -a "$1" != "BAR" ]; then
        echo "Usage: $0 <FOO or BAR> <Removed for SO>"
        exit
fi
if[“$#”-ne 2]|[“$1”!=“FOO”-a“$1”!=“BAR”];然后
echo“用法:$0”
出口
fi

您可以使用正则表达式匹配:

if [[ $# != 2 && ! $1 =~ ^(FOO|BAR)$ ]]
then
   ...
fi
这样做的优点是,如果第一个参数允许有更多的值,则更容易调整


但是,我不会将这两个条件合并为一个,而是将它们分开,并为它们提供不同的错误消息。

右侧条件中的
-a
是否比
|
具有更高的优先级?不需要优先级,因为
|
之后的所有内容都在
[…]
这意味着将单独评估
[…]
if [[ $# != 2 && ! $1 =~ ^(FOO|BAR)$ ]]
then
   ...
fi