为什么b在运行时不会总是改变它的值((a ++))&& ((b ++))在bash?

时间:2014-03-27 12:49:17

标签: bash command-line

让我们从我的终端采取以下示例:

$ a=0 && b=1
$ echo $a $b
0 1
$ # Everything OK
$ ((a++)) && ((b++))
$ echo $a $b
1 1
$ # What? Why only a changed its value and b no?
$ ((a++)) && ((b++))
$ echo $a $b
2 2
$ # Now the value of b has changed...

有人可以让我理解为什么会这样吗?

4 个答案:

答案 0 :(得分:5)

a++ post -increment,即在测试值后,增量发生。

a上的测试失败,因为a在测试时为零。

答案 1 :(得分:3)

&安培;&安培;是逻辑AND运算符。如果它的第一个参数是假的,那么它就不会对第二个参数进行评估。这被称为"短路"并节省处理时间。

由于++是后递增,如果在评估((a++)) && ((b++))时a为零,则评估第一个,得到零(这是假),将a加1,然后由于短路退出而不评估第二部分。所以b不会增加。

答案 2 :(得分:2)

((a++))会增加$a1的值。如果评估的表达式不是$?,则退出状态0为0,否则为1。如果由于&&导致其退出状态,则第二个命令 - ((b++)) - 将无法运行。

man bash所示,如果表达式的值非零,则返回状态为0;否则返回状态为1 。根据{{​​1}}是一个后增量表达式,表达式会计算a++本身,然后递增其值,以便当表达式$a的返回状态为((a++))时是非零,否则为0

所以,反直觉地说:

  • 取消设置1时,返回状态为$a
  • 1为字符串时,返回状态为$a
  • 1等于$a时,返回状态将为0
  • 1设置为不同于0的数字时,返回状态将为$a

查看示例:

变量为0

0

我们执行$ t=0 并查看命令返回的((t++))表达式:

echo $( command )

但请注意$ echo $(((t++))) 0 的值已增加。

$t

如果我们再次这样做,也是如此:

$ echo $t
1

请参阅$ echo $(((t++))) 1 $ echo $t 2 $ echo $(((t++))) 2 $ echo $t 3

  

(适用(表达式))

     

根据下述规则评估表达式   在算术评估下。 如果表达式的值是   非零,返回状态为0;否则返回状态为1 。   这完全等同于让“表达”。

答案 3 :(得分:1)

a为0时,((a++))的值被解释为不为真。