O operador de incremento não funciona em uma variável se a variável estiver definida como 0

O operador de incremento não funciona em uma variável se a variável estiver definida como 0

Incrementar uma variável varfunciona 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 ais 0so 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 ase tornou 1e 0é retornado.

Responder2

Isso funciona para mim (no bashUbuntu),

$ 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

informação relacionada