Состояние выхода Bash из сокращенного обозначения приращения

Я заметил явное несоответствие в статусе возврата 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?

2 ответа

Решение

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

Статус выхода (()) нотация равна нулю, если арифметическое выражение отлично от нуля, и наоборот.

A=A+1

Вы назначаете 1 для A, поэтому выражение оценивается как 1, выход из состояния ноль.

A++

Оператор POST-инкремента. Выражение оценивается как ноль, выход из состояния 1, а затем A увеличивается.

Другие вопросы по тегам