Состояние выхода 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 увеличивается.