I just started learning bash and I was reading about the $?
variable. From what I understood, $?
is assigned to the exit status of the last command executed.
For example
$ false; echo $?
Will yield 1, and
$ false; :; echo $?
Will yield 0
Things get a bit more complicated when I combine these with if/for blocks. The man page reads:
for
NAME [in
WORDS ... ];
do
COMMANDS;
done
Execute commands for each member in a list.
The
for
loop executes a sequence of commands for each member in a list of items. Ifin WORDS ...;
is not present, thenin "$@"
is assumed. For each element in WORDS, NAME is set to that element, and the COMMANDS are executed.Exit Status:
Returns the status of the last command executed.
That means:
$ false; for i in 1 2 3; do false; done; echo $?
Will yield 1 since the last command executed is false. But
$ false; for i in; do false; done; echo $?
or
$ false; if false; then :; fi; echo $?
Will yield 0 despite the fact that false was the last command executed.
My guess is the $?
variable is set to 0 when entering a for/if block. Am I missing something?
According to bash's manual:
if
list ;then
list ; [elif
list ;then
list ; ] ... [else
list ; ]fi
The
if
list
is executed. If its exit status is zero, thethen
list
is executed. Otherwise, eachelif
list
is executed in turn, and if its exit status is zero, the correspondingthen
list
is executed and the command completes. Otherwise, theelse
list
is executed, if present. The exit status (of the wholeif ... fi
block) is the exit status of the last command (in thethen
,elif
orelse
block) executed, or zero if no condition tested true.