
Incrementar una variable var
funciona en bash cuando está entre paréntesis dobles como (( var++ ))
. Pero descubrí que falla si la variable se establece en 0 de antemano, 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
¿Alguien puede explicar este comportamiento?
Ambiente:
Estoy usando gnome-terminal en Ubuntu Desktop 18.04.5 LTS.
Respuesta1
Con crédito desde aquí:https://unix.stackexchange.com/questions/146773/why-bash-increment-n-0n-return-error
El valor de retorno de (( expresión )) no indica un estado de error, pero, desde la página de manual de bash:
((expresión)) La expresión se evalúa de acuerdo con las reglas que se describen a continuación en EVALUACIÓN ARITMÉTICA. Si el valor de la expresión no es cero, el estado de retorno es 0; de lo contrario, el estado de devolución es 1. Esto es exactamente equivalente a dejar "expresión".
En ((a++))
estás haciendo un incremento de publicación. Se devuelve el valor de a
is 0
so y 1
, después de eso, se incrementa.
Comparar
$ unset a
$ ((a++)) ; echo Exitcode: $? a: $a
Exitcode: 1 a: 1
versus
$ unset a
$ ((++a)) ; echo Exitcode: $? a: $a
Exitcode: 0 a: 1
Un preincremento, así a
se ha convertido 1
y 0
se devuelve.
Respuesta2
Esto funciona para mí (en bash
Ubuntu),
$ a=0
$ echo $((a++))
0
$ echo $((a++))
1
$ echo $((a++))
2
$ echo $((a++))
3
$ echo $a
4
Note la diferencia con
$ a=0
$ echo $((++a))
1
$ echo $((++a))
2
$ echo $((++a))
3
$ echo $a
3