具有多个条件的Bash if语句会引发错误

时间:2013-04-24 22:09:47

标签: bash if-statement flags

我正在尝试编写一个将检查两个错误标志的脚本,如果一个标志(或两者)都被更改,它将会回显 - 发生错误。我的剧本:

my_error_flag=0
my_error_flag_o=0
do something.....
if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" &&     "$my_error_flag_o"="2" ]]; then
    echo "$my_error_flag"
else
    echo "no flag"
fi

基本上,应该是这样的:

if ((a=1 or b=2) or (a=1 and b=2))
  then
     display error
else
     no error
fi

我得到的错误是:

 line 26: conditional binary operator expected
 line 26: syntax error near `]'
 line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then'

我的括号搞砸了吗?

4 个答案:

答案 0 :(得分:201)

使用-a(for和)和-o(for或)操作。

tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

更新

实际上,您仍然可以使用&&||进行-eq操作。所以你的脚本会是这样的:

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ] || ([ $my_error_flag -eq 1 ] && [ $my_error_flag_o -eq 2 ]); then
      echo "$my_error_flag"
else
    echo "no flag"
fi

虽然在你的情况下,你可以丢弃最后两个表达式,只需坚持使用一个或类似的操作:

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ]; then
      echo "$my_error_flag"
else
    echo "no flag"
fi

答案 1 :(得分:51)

您可以使用[[((关键字。使用[[关键字时,必须使用-eq-lt等字符串运算符。我认为,((最适合算术,因为您可以直接使用==<>等运算符。

使用[[运算符

a=$1
b=$2
if [[ a -eq 1 || b -eq 2 ]] || [[ a -eq 3 && b -eq 4 ]]
then
     echo "Error"
else
     echo "No Error"
fi

使用((运算符

a=$1
b=$2
if (( a == 1 || b == 2 )) || (( a == 3 && b == 4 ))
then
     echo "Error"
else
     echo "No Error"
fi

请勿使用-a-o运算符,因为它不是便携式的。

答案 2 :(得分:7)

请尝试以下

if ([ $dateR -ge 234 ] && [ $dateR -lt 238 ]) || ([ $dateR -ge 834 ] && [ $dateR -lt 838 ]) || ([ $dateR -ge 1434 ] && [ $dateR -lt 1438 ]) || ([ $dateR -ge 2034 ] && [ $dateR -lt 2038 ]) ;
then
    echo "WORKING"
else
    echo "Out of range!"

答案 3 :(得分:1)

您可以通过阅读MySQL的贡献者编写的entrypoint.sh script来获取灵感,该-a Angular2 method binding error: "value has changed after it was checked"检查指定的变量是否已设置。

如脚本所示,您可以使用if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then ... fi 来管道它们,例如:

....Call enableProdMode() to enable the production mode.