¿Por qué a = 0; deja que a ++ devuelva el código de salida 1?

16

Intentalo:

$ a=0
$ let a++
$ echo $?
1 # Did the world just go mad?
$ echo $a
1 # Yes, it did.
$ let a++
$ echo $?
0 # We have normality.
$ echo $a
2

Contraste con esto:

$ b=0
$ let b+=1
$ echo $?
0

Y esto (de Sirex ):

$ c=0
$ let ++c
$ echo $?
0

¿Que esta pasando aqui?

$ bash --version
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
l0b0
fuente

Respuestas:

19

De help let:

Exit Status:
If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise..

Dado que var++es posterior al aumento, supongo que el último argumento se evalúa a cero. Sutil...

Una ilustración quizás más clara:

$ let x=-1 ; echo x=$x \$?=$?
x=-1 $?=0
$ let x=0 ; echo x=$x \$?=$?
x=0 $?=1
$ let x=1 ; echo x=$x \$?=$?
x=1 $?=0
$ let x=2 ; echo x=$x \$?=$?
x=2 $?=0
l0b0
fuente
1
buen lugar. Supongo que ++ a actuaría igual que + = 1, entonces
Sirex
Sí, eso funciona.
l0b0
1
Para el registro, este comportamiento es el mismo en mi instancia de ksh88 (aunque el incremento posterior let a++no funciona)
rahmu
1
Gracias, eso me ayudó. - Y no perderé más tiempo y preguntaré: "¿Por qué?"
no es un usuario