为什么bash有以下行为?
echo $((true == false))
1
Run Code Online (Sandbox Code Playgroud)
我原本以为这会打印0,但会打印出来1.
以下事实使这进一步复杂化:
> echo $((true))
0
> echo $((false))
0
> echo $((true == true))
1
> echo $((false == false))
1
Run Code Online (Sandbox Code Playgroud)
zos*_*tay 56
所有关于0为真,1为假的海报都忽略了这一点.在这种情况下,由于引起的算术评估上下文,1在通常的布尔意义上为0且为0 $(()).
==内部的操作$(())不是Bash中返回状态的相等,它使用给定的文字执行数字相等,其中"false"和"true"被视为变量,但尚未被绑定,因为它们都被解释为0尚未赋值:
$ echo $((true))
0
$ echo $((false))
0
Run Code Online (Sandbox Code Playgroud)
如果您想比较true和false的返回状态,您需要以下内容:
true
TRUE=$?
false
FALSE=$?
if (( $TRUE == $FALSE )); then echo TRUE; else echo FALSE; fi
Run Code Online (Sandbox Code Playgroud)
但是,我不确定你为什么要这样做.
编辑:更正了原始答案中关于"true"和"false"被解释为字符串的部分.他们不是.它们被视为变量,但尚未绑定它们.
fge*_*fge 22
好吧,似乎对于$((...))真正做的事情存在很多困惑.
它对其操作数进行算术评估,裸字是变量,而不是命令或字符串文字(即,true实际上是$true),并且任何不是数字的都是0.该==运算符比较两个数字,并返回1,如果他们是平等的.
这就是为什么$((true == false))1:环境中没有环境变量true或false环境变量,这意味着它们$true并且$false计算空字符串,因此在算术上下文中为0!
要完成,您还可以在算术上下文中使用命令替换...例如:
$ echo $((`echo 2`))
2
$ echo $((3 + $(echo 4)))
7
$ a=3
$ echo $((a + $(echo 4)))
7
# undefine a
$ a=
$ echo $((a + $(echo 4)))
4
$ a="Hello world"
$ echo $((a + 1))
1
# undefine a again
$ a=
$ echo $(($(echo $a)))
0
Run Code Online (Sandbox Code Playgroud)