我有此代码:
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"
这是为什么?算术表达式在[[ ]]
中不能正常工作吗?
答案 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