我注意到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
?
答案 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递增。