Bash exit status of shorthand increment notation

天大地大妈咪最大 提交于 2020-12-25 08:42:08

问题


I noticed an apparent inconsistency in the return status of bash's (( )) notation.
Consider the following

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

However using the other well known shorthand increment notation yields:

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

If one has the builtin set -e in the script the second notation will cause the script to exit, since the exit status of the ((A++)) returned non-zero. This question was more or less addressed in this related question. But it does not seem to explain the difference in exit status for the two notations ((A=A+1)) and ((A++))

((A++)) seems to return 1 if and only if A equals 0. (Disclaimer: I have not done exhaustive tests. Tested in bash 4.1.2 and 4.2.25). So the final question boils down to:

Why does A=0; ((A++)) return 1?


回答1:


a++ is post-increment: it increments after the statement is evaluated. By contrast, ++a increments before. Thus:

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

In the first case, ((a++)), the arithmetic expression is evaluated first, while a is still zero, yielding a value of zero (and hence a nonzero return status). Then, afterward, a is incremented.

In second case, ((++a)), a is incremented to 1 and then ((...)) is evaluated. Since a is nonzero when the arithmetic expression is evaluated, the return status is zero.

From man bash:

   id++ id--
          variable post-increment and post-decrement
   ++id --id
          variable pre-increment and pre-decrement



回答2:


The exit status of the (()) notation is zero if the arithmetic expression is nonzero, and vice versa.

A=A+1

You assign 1 to A, so the expression evaluates to 1, exit status zero.

A++

POST-increment operator. The expression evaluates to zero, exit status 1, and then A is incremented.



来源:https://stackoverflow.com/questions/22428894/bash-exit-status-of-shorthand-increment-notation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!