Por que a = 0; deixe um código de saída de retorno ++ 1?

16

Tente:

$ 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 com isso:

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

E isso (da Sirex ):

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

O que está acontecendo aqui?

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

Respostas:

19

De help let:

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

Como var++é pós- incremento, acho que o último argumento é avaliado como zero. Sutil...

Uma ilustração talvez mais 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
fonte
11
bom lugar. i estou supondo ++ um actuaria o mesmo que + = 1 então
Sirex
Sim, isso funciona.
L0b0
11
Para o registro, este comportamento é o mesmo no meu exemplo ksh88 (embora pós-incremento let a++não funciona)
rahmu
11
Obrigado, isso me ajudou. - E não vou perder mais tempo e perguntar: "Por quê?"
não usuário