Quelque chose comme ça ?
while true; do
case $RANDOM in *0) exit 27 ;; esac
done
Ou comme ça ?
rc=0
for file in *; do
grep fnord "$file" || rc=$?
done
exit $rc
La vraie question est de décider si le code de sortie de la boucle doit être un succès ou un échec si une itération échoue. Il y a des scénarios où l'un a plus de sens que l'autre, et d'autres où ce n'est pas du tout clair.
L'état de la boucle est l'état de la dernière commande qui s'exécute. Vous pouvez utiliser break pour sortir de la boucle, mais si le break réussit, le statut de la boucle sera 0
. Cependant, vous pouvez utiliser un sous-shell et quitter au lieu de rompre. En d'autres termes :
for i in foo bar; do echo $i; false; break; done; echo $? # The loop succeeds
( for i in foo bar; do echo $i; false; exit; done ); echo $? # The loop fails
Vous pouvez également placer la boucle dans une fonction et en renvoyer une valeur. ex :
in() { local c="$1"; shift; for i; do test "$i" = "$c" && return 0; done; return 1; }
Le manuel bash dit :
while list-1; do list-2; done
until list-1; do list-2; done
[..]The exit status of the while and until commands is the exit status
of the last command executed in list-2, or zero if none was executed.[..]
La dernière commande exécutée à l'intérieur la boucle est break
. Et la valeur de sortie de break
vaut 0 (voir :help break
).
C'est pourquoi votre programme continue de sortir avec 0.