为什么这个是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&&
具有短路属性(以及逻辑属性)。需要注意的是逻辑并不等于一直短路。