[[ 里面的算术表达式
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 )) ]]
被解释为 [[
.
的参数
我有这个代码:
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 )) ]]
被解释为 [[
.