Bash退出状态的简写增量表示法

时间:2014-03-15 19:49:02

标签: bash shorthand exitstatus

我注意到bash的(( ))表示法的返回状态存在明显的不一致。
请考虑以下

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

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

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

如果脚本中有内置set -e,则第二种表示法将导致脚本退出,因为((A++))的退出状态返回非零。 this related question或多或少地解决了这个问题。但它似乎没有解释两个符号((A=A+1))((A++))的退出状态的差异

当且仅当((A++))等于1时,

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

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

A=A+1

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

A++

POST增量运算符。表达式求值为零,退出状态1,然后A递增。