在Bash脚本中使用多个条件变量

4

我需要做这件事:

if [ $X != "dogs" and "birds" and "dogs" ]
then
    echo "it's is a monkey"
fi

使用bash脚本。该如何操作?
4个回答

6

您需要将每个选项转换为单独的条件表达式,然后使用 &&(AND)运算符将它们连接在一起。

if [[ $X != dogs && $X != birds && $X != cats ]]; then
  echo "'$X' is not dogs or birds or cats.  It must be monkeys."
fi

你也可以使用单个 [...] 来实现此功能,但是这样你需要为每个比较使用一个单独的集合,并将 and 运算符移到它们之外:
if [ "$X" != dogs ] && [ "$X" != birds ] && [ "$X" != cats ]; then
   ...
fi

请注意,像 dogs 这样的单词字符串不需要使用双引号,但是在单括号版本内部使用参数扩展(变量)如 $X,则需要使用双引号,因为参数值中的空格将导致语法错误。
此外,在Shell脚本中没有必要使用大写变量名,最好保留给从环境中传入的变量,如 $PATH$TERM 等等。
OR 的 Shell 操作符版本是 ||,其工作方式相同。

请注意,在条件表达式中,您不必在双括号中引用$X,因为bash不会对参数执行单词扩展。即使X="lassie scooby"[[ $X != dogs ]]也可以正常工作。 - chepner
我该如何做到这一点:如果 [ $X != "dogs" OR "birds" OR "dogs" ]?似乎 || 只接受两个条件... - user2079266
@user2079266 - 请看编辑。OR是||的意思。但是你的措辞让条件永远为真——$X不能同时既是狗又是鸟,因此它将始终测试为不是其中之一或不是另一个。 - Mark Reed
@user2079266 - 你需要 [[ ! ( $X = dogs || $X = birds || $X = cats ) ]] 吗?这个表达式等价于 && 表达式,但应用了德摩根定律 - chepner
2
еңЁ[]дёӯпјҢжӮЁеҸҜд»ҘдҪҝз”Ё-aиЎЁзӨә&&пјҢдҪҝз”Ё-oиЎЁзӨә||гҖӮ - Idelic

3

您甚至可以想得不同...

if ! [[ $X == dogs || $X == birds || $X == cats ]]; then
    echo "'$X' is not dogs or birds or cats... It could be monkeys."
fi

关于思考:

它既不是狗也不是猫,也不是鸟。

与以下思考并不完全相同:

它不是狗、猫或鸟中的任何一个。

这使得使用case更加明显;总的来说,在这种情况下,我认为正确的方法是:

case $X in
    dogs )
        # There may be some part of code
        ;;
    birds )
        # There may be some other part
        ;;
    cats )
        # There is no need to be something at all...
       ;;          
    * )
       echo "'$X' is not dogs or birds or cats... It could be monkeys."
       ;;
esac

或者,如果真的没有必要处理鸟、猫或狗的情况:

case $X in
    dogs|birds|cats ) ;;
    * )
       echo "'$X' is not dogs or birds or cats... It could be monkeys."
       ;;
esac

哈哈,是的,它可能是猴子。我会因为你聪明地将它从if改为case而给你加分 :) - V H

1
我能想到的在Bash中避免多次输入$X的唯一方法是使用正则表达式:
if [[ ! "$X" =~ (dogs|birds|cats) ]]; then
    echo "it's is a monkey"
fi

同样地,简写为:


[[ ! "$X" =~ (dogs|birds|cats) ]] && echo "it's is a monkey"

当你有非常长的变量和/或非常短的比较时,这将非常有用。

记得转义特殊字符。


0
X=$1;
if [ "$X" != "dogs" -a "$X" != "birds" -a "$X" != "dogs" ]
then
    echo "it's is a monkey"
fi

最接近你已有的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接