尝试理解 Bash 逻辑测试,结果却相反:

尝试理解 Bash 逻辑测试,结果却相反:

为什么这个是0?

$ echo $(( 0 && 0 ))
0

为什么这个是0?

$ echo $(( 1 && 0 ))
0

为什么这个是0?

$ echo $(( 0 && 1 ))
0

为什么这个是1?

$ echo $(( 1 && 1 ))
1

答案1

这符合“逻辑和”,这就是&&算术上下文中的含义。真值表如下:

  |  F  |  T
--+-----+-----
F |  F  |  F
--+-----+-----
T |  F  |  T

仅当 A 和 B 都为真时,“A 和 B”才为真。

在 shell 的算术上下文中,运算符是按照 C 标准中的定义实现,其中“true”是任何非零值,“false”是零。这确实与退出代码相反,其中“true”(或更确切地说,“成功”)为零,而“false”(或更确切地说,“错误”)是任何非零值。

也可以看看:

$ echo $((2 && 2))
1

$ echo $((-1 && 2))
1

答案2

man $SHELL

告诉

&&     logical AND

所以规则是只有当左侧为 TRUE 时才会评估右侧。由于您使用的是 0 和 1 的约定。0 为 FALSE,1 为 TRUE。

现在让我们讨论代码,然后进行解释。

echo $(( 0 && 0 ))

&& - 不会计算右侧,因为左侧为 0,因此打印 0

$ echo $(( 1 && 0 ))

&& - 将评估右侧,因为左侧为 1,遗憾的是右侧为 0,因此打印 0

echo $(( 0 && 1 ))

&& - 不会评估右侧,因为左侧为 0,因此打印 0

echo $(( 1 && 1 ))

&& - 将评估右侧,因为左侧为 1,并且右侧也是 1,因此打印 1。

编辑

正如一位用户所指出的,SHELL&&具有短路属性(以及逻辑属性)。需要注意的是逻辑并不等于一直短路。

相关内容