[[ 里面的算术表达式

Arithmetic expression inside [[

我有这个代码:

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"

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

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

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

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

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

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

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

[[里面的( )]]是用来嵌套表达式的。前任。 [[ a = a && (b = b || c = d) ]]

非空字符串为真。所以 [[ some_string ]][[ "some other string" ]] returns 为真。 [[ "" ]][[ '' ]] returns 错误。

!为否定

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

首先发生 $fruit 的扩展。所以它变成了:[[ "apple" = "apple" && ( ( "flag" == "0" ) ) ]]( ) 只是大括号,这不是算术展开。字符串"apple"等于"apple",但字符串"flag"不等于字符串"0",所以总是returns为false。

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

因为 $flag 展开了,所以 [[ 看到:[[ "apple" = "apple" && ((0 == 0)) ]]。所以比较恰好有效,但是 == 正在进行字符串比较。

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

flag 是一个非空字符串,所以它计算为真。 ! flag 评估为假。

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

首先$flag扩展为0。由于 0 是一个非空字符串,因此它的计算结果为真。 ! 0 的计算结果为假。 ((! 0)) 为假,因此整个表达式 returns 非零。

Won't arithmetic expressions work properly inside [[ ]]?

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

的参数