如何在 bash 中的 if 语句中使用多个条件?

How to use multiple condition in if statement in bash?

其实我是一个新 bash 学习者。我可以在 bash 命令中使用一个条件。但是如何在bash中使用多个条件呢?我可以这样使用 if statement

read a
if [ $a = "y" ] ; then
   echo "YES"
elif [ $a = "Y" ] ; then
   echo "YES"
else
   echo "NO"
fi

我发现了这样的东西:

read a b c

if [ $a -eq $b and $b -eq $c ] ; then
    echo "EQUILATERAL"
elif [ $a -eq $b or $b -eq $c ] ; then
    echo "ISOSCELES"
else
    echo "SCALENE"
fi

我只想知道,用什么代替 andor

and使用&&(对or使用||

read a b c

if [ "$a" == "$b" ] && [ "$b" == "$c" ] ; then
    echo "EQUILATERAL"
elif [ "$a" == "$b" ] || [ "$b" == "$c" ] ; then
    echo "ISOSCELES"
else
    echo "SCALENE"
fi

使用&&||有多个条件。此外,将方括号更改为圆括号。另外将 -eq 更改为 == 因为您比较的是数字而不是字符串。这有效:

#!/bin/bash

read a b c

if (( $a == $b )) && (( $b == $c )); then
    echo "EQUILATERAL"
elif (( $a == $b )) || (( $b == $c )) ; then
    echo "ISOSCELES"
else
    echo "SCALENE"
fi

除了前面的答案,在单个 [test(它们相同)子句中使用复合表达式的正确方法是使用 -a(对于and) 和 -o(对于 or)。

(例如测试 file1file2 是否可读):

if [ -r "$file1" -a -r "$file2 ]
then
    # do something with the files
fi

使用test本身:

if test -r "$file1" -a -r "$file2
then
    # do something with the files
fi

test 括号内执行此操作的可移植方法是使用 -a-o。但是要注意 -eq 是一个数字比较,所以你需要在比较它们之前确保你的变量是数字。像这样:

#! /bin/sh

read a b c
expr "$a" : '[0-9][0-9]*$' \& "$b" : '[0-9][0-9]*$' \& "$c" : '[0-9][0-9]*$' >/dev/null || exit

if [ $a -eq $b -a $b -eq $c ] ; then
    echo "EQUILATERAL"
elif [ $a -eq $b -o $b -eq $c ] ; then
    echo "ISOSCELES"
else
    echo "SCALENE"
fi