【问题标题】:Why does $((true == false)) evaluate to 1 in bash?为什么 $((true == false)) 在 bash 中评估为 1?
【发布时间】: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


    【解决方案1】:

    所有谈论 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 )) 将按照您的预期报告0echo $(( $TRUE == $TRUE ))echo $(( $FALSE == $FALSE )) 也会报告 1
    • 这是正确的。 "true" 和 "false" 作为布尔值在 bash 中不存在,因此在 $(()) 中没有特殊含义
    • +1,所有其他答案为-1...还有其他人读过这个问题吗?
    • 对不起,但这不成立。例如:如果(( $TRUE == $FALSE )); then echo TRUE; else echo FALSE; fi(( 的语法错误。然后$((...)) 对其操作数执行算术评估。 $((true)) 返回 0 的事实是因为在名为 true 的环境中没有变量,并且操作数的算术评估为 ANY 字符串生成 0。
    • @fge,您部分正确,但不完全正确。确实,$((true)) 返回 0,因为 $true 在本地环境中没有被赋值(我的解释中没有完全正确)并且会暂时更正。我相信@izkata 已经解释了您不完全正确的部分,因为给出的if (( $TRUE == $FALSE )); ... 在我的Mac 上使用全新环境在Bash 3.2 上运行得很好。这很可能是旧版本 Bash 的语法错误。
    【解决方案2】:

    好的,所以,对于$((...)) 的真正作用似乎存在很多困惑。

    对其操作数进行算术评估,裸字是变量,而不是命令或字符串文字(即,true 实际上是 $true),并且 任何不是数字的都是0。 == 运算符比较两个数字,如果相等则返回 1。

    这就是为什么$((true == false)) 为1:环境中没有truefalse 环境变量,这意味着$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
    

    【讨论】:

    • 我已经对这个答案投了赞成票,因为你说的和@zostay 完全一样,你只是不理解他的例子。您收到语法错误,因为 TRUE 和 FALSE 未在您的 shell 中定义;他的完整示例将它们定义为真假命令的数字返回码(在另一个答案中更仔细地查看它上面的 4 行;TRUE=$? 正在定义变量 $TRUE 等。)
    • 我对这个例子进行了纠正。但不,我说的不是同一件事:@zostay 说 truefalse 被视为字符串 - 不是这样!它们被视为环境变量,这是一个完全不同的野兽,$true$false 评估为空字符串,而不是文字。尝试echo $(($(echo $a))),其中未定义a:它不会产生语法错误但返回0。不过,他正确地说,字符串计算为0。但事实上,任何不是数字的东西都会计算为0这个上下文。
    猜你喜欢
    • 2015-03-15
    • 2012-03-06
    • 2022-01-10
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    相关资源
    最近更新 更多