
Incrementar uma variável var
funciona no bash quando colocada entre parênteses duplos, como (( var++ ))
. Mas descobri que ele falha se a variável for definida como 0 anteriormente, como var=0
.
$ a=0
$ ((a++)) && echo "command succeeded" || echo "command failed"
command failed
$ a=1
$ ((a++)) && echo "command succeeded" || echo "command failed"
command succeeded
Alguém pode explicar esse comportamento?
Ambiente:
Estou usando o gnome-terminal no Ubuntu Desktop 18.04.5 LTS.
Responder1
Com crédito daqui:https://unix.stackexchange.com/questions/146773/why-bash-increment-n-0n-return-error
O valor de retorno de (( expressão )) não indica um status de erro, mas, na página de manual do bash:
((expressão)) A expressão é avaliada de acordo com as regras descritas abaixo em AVALIAÇÃO ARITMÉTICA. Se o valor da expressão for diferente de zero, o status de retorno será 0; caso contrário, o status de retorno será 1. Isso é exatamente equivalente a let "expressão".
Em ((a++))
você está fazendo um incremento de postagem. O valor de a
is 0
so 1
é retornado, após isso é incrementado.
Comparar
$ unset a
$ ((a++)) ; echo Exitcode: $? a: $a
Exitcode: 1 a: 1
contra
$ unset a
$ ((++a)) ; echo Exitcode: $? a: $a
Exitcode: 0 a: 1
Um pré-incremento, então a
se tornou 1
e 0
é retornado.
Responder2
Isso funciona para mim (no bash
Ubuntu),
$ a=0
$ echo $((a++))
0
$ echo $((a++))
1
$ echo $((a++))
2
$ echo $((a++))
3
$ echo $a
4
Observe a diferença com
$ a=0
$ echo $((++a))
1
$ echo $((++a))
2
$ echo $((++a))
3
$ echo $a
3