我注意到 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
?
最佳答案
a++
是后递增的:它在语句求值后递增。相比之下,++a
之前递增。因此:
$ a=0 ; ((a++)) ; echo $a $?
1 1
$ a=0 ; ((++a)) ; echo $a $?
1 0
在第一种情况下,((a++))
,首先计算算术表达式,而 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
关于速记增量符号的 Bash 退出状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22428894/