[[[

时间:2019-09-09 17:40:21

标签: bash if-statement syntax arithmetic-expressions

我有此代码:

fruit=apple
flag=0

[[ $fruit = "apple" && ((flag == 0)) ]]  && echo "1"
[[ $fruit = "apple" && (($flag == 0)) ]] && echo "2"
[[ $fruit = "apple" && ((! flag)) ]]     && echo "3"
[[ $fruit = "apple" && ((! $flag)) ]]    && echo "4"

所有的人都希望回声。但是,只有第二条语句可以正常工作:

[[ $fruit = "apple" && (($flag == 0)) ]] && echo "2"

这是为什么?算术表达式在[[ ]]中不能正常工作吗?

2 个答案:

答案 0 :(得分:3)

===的工作原理相同-它是字符串比较。

( ) [[中的]]用于嵌套表达式。例如[[ a = a && (b = b || c = d) ]]

非空字符串为true。因此[[ some_string ]][[ "some other string" ]]返回true。 [[ "" ]][[ '' ]]返回false。

!是否定符。

[[ $fruit = "apple" && ((flag == 0)) ]]

首先发生$fruit的扩展。因此它变为:[[ "apple" = "apple" && ( ( "flag" == "0" ) ) ]]( )只是括号,这不是语法扩展。字符串"apple"等于"apple",但是字符串"flag"不等于字符串"0",因此它总是返回false。

[[ $fruit = "apple" && (($flag == 0)) ]]

由于$flag被展开,因此[[看到:[[ "apple" = "apple" && ((0 == 0)) ]]。这样比较就可以了,但是==在做字符串比较。

 [[ $fruit = "apple" && ((! flag)) ]]

flag是一个非空字符串,因此将其评估为true。 ! flag散为false。

 [[ $fruit = "apple" && ((! $flag)) ]]

第一个$flag扩展为0。由于0是一个非空字符串,因此其值为true。 ! 0的计算结果为false。 ((! 0))为假,因此整个表达式返回非零。

  

[[]]内的算术表达式不能正常工作吗?

否,算术表达式在[[ ]]内部不起作用,就像[[ echo 1 ]]不起作用一样。 echo 1 ]]是内置[[的参数,而不是独立的命令。 [[ (( 0 )) ]](( 0 )) ]]被解释为[[的参数。

答案 1 :(得分:2)

((...))是算术命令(或语句);算术表达式 expresson $((...))。你想要

[[ $fruit = "apple" ]] && ((flag == 0)) && echo 1
# etc.

[[ $fruit = apple && $((flag == 0)) ]]会失败,因为[[ ... ]]会将算术表达式的求值简单地视为非空字符串(始终为true)而不是布尔值。

为完整起见,您可以使用单个[[ ... ]]命令:

[[ $fruit = apple && flag -eq 0 ]] && echo 1
# etc