So etwas?
while true; do
case $RANDOM in *0) exit 27 ;; esac
done
Oder so?
rc=0
for file in *; do
grep fnord "$file" || rc=$?
done
exit $rc
Die eigentliche Frage besteht darin, zu entscheiden, ob der Exit-Code der Schleife Erfolg oder Misserfolg sein soll, wenn eine Iteration fehlschlägt. Es gibt Szenarien, in denen das eine sinnvoller ist als das andere, und andere, in denen es überhaupt nicht eindeutig ist.
Der Status der Schleife ist der Status des zuletzt ausgeführten Befehls. Sie können break verwenden, um aus der Schleife auszubrechen, aber wenn der Break erfolgreich ist, dann ist der Status der Schleife 0
. Sie können jedoch eine Subshell verwenden und beenden, anstatt zu brechen. Mit anderen Worten:
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
Sie können die Schleife auch in eine Funktion einfügen und einen Wert davon zurückgeben. zB:
in() { local c="$1"; shift; for i; do test "$i" = "$c" && return 0; done; return 1; }
Das Bash-Handbuch sagt:
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.[..]
Der letzte Befehl, der innerhalb ausgeführt wird die Schleife ist break
. Und der Exit-Wert von break
0 ist (siehe:help break
).
Deshalb wird Ihr Programm immer mit 0 beendet.