Оператор инкремента не работает с переменной, если переменная имеет значение 0.

Оператор инкремента не работает с переменной, если переменная имеет значение 0.

Увеличение переменной varработает в bash, если она заключена в двойные скобки, например (( var++ )). Но я обнаружил, что это не удается, если переменная заранее установлена ​​в 0, например var=0.

$ a=0
$ ((a++)) && echo "command succeeded" || echo "command failed"
command failed

$ a=1
$ ((a++)) && echo "command succeeded" || echo "command failed"
command succeeded

Может ли кто-нибудь объяснить такое поведение?

Среда:

Я использую gnome-terminal на Ubuntu Desktop 18.04.5 LTS.

решение1

Ссылка на источник:https://unix.stackexchange.com/questions/146773/why-bash-increment-n-0n-return-error

Возвращаемое значение ((выражение)) не указывает на статус ошибки, но, согласно странице руководства bash:

((выражение)) Выражение вычисляется в соответствии с правилами, описанными ниже в разделе АРИФМЕТИЧЕСКАЯ ОЦЕНКА. Если значение выражения не равно нулю, статус возврата равен 0; в противном случае статус возврата равен 1. Это в точности эквивалентно let "выражение".

В ((a++))вы делаете пост-инкремент. Значение ais 0so 1возвращается, после этого оно инкрементируется.

Сравнивать

$ unset a
$ ((a++)) ; echo Exitcode: $? a: $a
Exitcode: 1 a: 1

против

$ unset a
$ ((++a)) ; echo Exitcode: $? a: $a
Exitcode: 0 a: 1

Предварительное приращение, поэтому aстало 1и 0возвращается.

решение2

У меня это работает (в bashUbuntu),

$ a=0
$ echo $((a++))
0
$ echo $((a++))
1
$ echo $((a++))
2
$ echo $((a++))
3
$ echo $a
4

Обратите внимание на разницу с

$ a=0
$ echo $((++a))
1
$ echo $((++a))
2
$ echo $((++a))
3
$ echo $a
3

Связанный контент