
Увеличение переменной 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++))
вы делаете пост-инкремент. Значение a
is 0
so 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
У меня это работает (в bash
Ubuntu),
$ 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