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

Sim*_*_me 147 bash flags if-statement

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

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
Run Code Online (Sandbox Code Playgroud)

基本上,它应该是,以下内容:

if ((a=1 or b=2) or (a=1 and b=2))
  then
     display error
else
     no error
fi
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

 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'
Run Code Online (Sandbox Code Playgroud)

我的括号搞砸了吗?

mkh*_*tib 217

使用-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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

  • `-a`和`-o`被[POSIX规范]认为是过时的(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html#tag_20_128_16); 使用单独的测试与更新中的`||`结合使用. (7认同)
  • 顺便说一下,原始代码中的问题包括使用`[`和`]`进行分组(它们没有这样做),并且没有在运算符周围放置空格(例如``$ my_error_flag"="1"`),防止shell将其识别为操作员.请阅读[BashFAQ#17(关于分组)](http://mywiki.wooledge.org/BashFAQ/017)和[#31(关于不同类型的测试表达式之间的差异)](http://mywiki.wooledge .ORG/BashFAQ/031).实际上,在这种情况下,使用[算术表达式](http://mywiki.wooledge.org/ArithmeticExpression)会更容易. (4认同)
  • @Simply_Me:不,如果其操作数的*或两者*为真,则逻辑OR为真.您正在考虑"异或"(XOR),如果其中一个操作数是真的,则为真.(实际上,有一些XOR版本适用于2个以上的操作数,在这种情况下,如果奇数个操作数为真,则为真.) (3认同)
  • 添加到上面的 phk 评论中,( ) 正在 bash 中启动子 shell,这可能会产生各种微妙的 [可能是不需要的] 效果。 (2认同)

Fiz*_*han 59

您可以使用[[((关键字.使用[[关键字时,必须使用字符串运算符,例如-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
Run Code Online (Sandbox Code Playgroud)

使用((运算符

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

不要使用-a-o运营商因为它不是便携式的.


小智 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!"
Run Code Online (Sandbox Code Playgroud)

  • 使用`{...; }`用于不创建子shell的分组。 (3认同)
  • `(...)`创建子外壳-大量的性能影响毫无益处。 (2认同)