14

我注意到bash符号的返回状态明显不一致。 考虑以下(( ))

$> A=0
$> ((A=A+1))
$> echo $? $A
0 1

然而,使用其他众所周知的速记增量符号会产生:

$> A=0
$> ((A++))
$> echo $? $A
1 1

如果set -e脚本中有内置函数,则第二种表示法将导致脚本退出,因为((A++))返回的退出状态非零。这个问题或多或少在这个相关问题中得到了解决。但这似乎并不能解释这两种符号的退出状态的差异,((A=A+1))并且((A++))

((A++))1当且仅当Aequals似乎返回0。(免责声明:我没有做过详尽的测试。在 bash 4.1.2 和 4.2.25 中测试过)。所以最后一个问题归结为:

为什么A=0; ((A++))返回1

4

2 回答 2

8

a++是后增量:它在评估语句后递增。相比之下,++a之前的增量。因此:

$ a=0 ; ((a++)) ; echo $a $?
1 1
$ a=0 ; ((++a)) ; echo $a $?
1 0

在第一种情况下,首先((a++))计算算术表达式,此时a仍然为零,产生零值(因此返回非零状态)。然后,之后,a递增。

在第二种情况下,((++a)),a递增到 1,然后((...))进行评估。由于a在计算算术表达式时为非零,因此返回状态为零。

来自man bash

   id++ id--
          variable post-increment and post-decrement
   ++id --id
          variable pre-increment and pre-decrement
于 2014-03-15T19:55:03.953 回答
3

如果算术表达式不为零,则表示法的退出状态(())为零,反之亦然。

A=A+1

您将 1 分配给 A,因此表达式的计算结果为 1,退出状态为零。

A++

后增量运算符。表达式的计算结果为零,退出状态 1,然后 A 递增。

于 2014-03-15T19:55:47.457 回答