Pan*_*tes 9 bash shorthand exitstatus
我注意到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只有在A等于时返回0.(免责声明:我没有做过详尽的测试.在bash 4.1.2和4.2.25中测试过).所以最后一个问题归结为:
为什么要A=0; ((A++))回来1?
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