【发布时间】:2012-01-24 15:35:43
【问题描述】:
为什么 bash 会有以下行为?
echo $((true == false))
1
我原以为这会打印0,但它会打印1。
以下事实使情况更加复杂:
> echo $((true))
0
> echo $((false))
0
> echo $((true == true))
1
> echo $((false == false))
1
【问题讨论】:
标签: bash
为什么 bash 会有以下行为?
echo $((true == false))
1
我原以为这会打印0,但它会打印1。
以下事实使情况更加复杂:
> echo $((true))
0
> echo $((false))
0
> echo $((true == true))
1
> echo $((false == false))
1
【问题讨论】:
标签: bash
所有谈论 0 为真和 1 为假的海报都没有抓住重点。在这种情况下,由于$(()) 引起的算术评估上下文,在通常的布尔意义上,1 为真,0 为假。
$(()) 内部的 == 操作不是 Bash 中返回状态的相等性,它使用给定的文字执行数值相等,其中 "false" 和 "true" 被视为变量,但尚未绑定,两者都被解释为 0,因为它们还没有赋值:
$ echo $((true))
0
$ echo $((false))
0
如果你想比较 true 和 false 的返回状态,你想要这样的东西:
true
TRUE=$?
false
FALSE=$?
if (( $TRUE == $FALSE )); then echo TRUE; else echo FALSE; fi
但是,我不确定你为什么要这样做。
编辑:更正了原始答案中关于“true”和“false”被解释为字符串的部分。他们不是。它们被视为变量,但尚未绑定任何值。
【讨论】:
echo $(( $TRUE == $FALSE )) 将按照您的预期报告0。 echo $(( $TRUE == $TRUE )) 和 echo $(( $FALSE == $FALSE )) 也会报告 1。
$(()) 中没有特殊含义
(( $TRUE == $FALSE )); then echo TRUE; else echo FALSE; fi 是(( 的语法错误。然后$((...)) 对其操作数执行算术评估。 $((true)) 返回 0 的事实是因为在名为 true 的环境中没有变量,并且操作数的算术评估为 ANY 字符串生成 0。
$((true)) 返回 0,因为 $true 在本地环境中没有被赋值(我的解释中没有完全正确)并且会暂时更正。我相信@izkata 已经解释了您不完全正确的部分,因为给出的if (( $TRUE == $FALSE )); ... 在我的Mac 上使用全新环境在Bash 3.2 上运行得很好。这很可能是旧版本 Bash 的语法错误。
好的,所以,对于$((...)) 的真正作用似乎存在很多困惑。
它对其操作数进行算术评估,裸字是变量,而不是命令或字符串文字(即,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
【讨论】:
TRUE=$? 正在定义变量 $TRUE 等。)
true 和 false 被视为字符串 - 不是这样!它们被视为环境变量,这是一个完全不同的野兽,$true 和 $false 评估为空字符串,而不是文字。尝试echo $(($(echo $a))),其中未定义a:它不会产生语法错误但返回0。不过,他正确地说,字符串计算为0。但事实上,任何不是数字的东西都会计算为0这个上下文。