Qualcosa del genere?
while true; do
case $RANDOM in *0) exit 27 ;; esac
done
O così?
rc=0
for file in *; do
grep fnord "$file" || rc=$?
done
exit $rc
La vera domanda è decidere se il codice di uscita del ciclo debba essere un successo o un fallimento se un'iterazione fallisce. Ci sono scenari in cui uno ha più senso dell'altro e altri in cui non è affatto chiaro.
Lo stato del ciclo è lo stato dell'ultimo comando eseguito. Puoi usare break per uscire dal loop, ma se l'interruzione ha successo, lo stato del loop sarà 0
. Tuttavia, puoi usare una subshell ed uscire invece di rompere. In altre parole:
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
Puoi anche inserire il ciclo in una funzione e restituire un valore da essa. es:
in() { local c="$1"; shift; for i; do test "$i" = "$c" && return 0; done; return 1; }
Il manuale di bash dice:
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.[..]
L'ultimo comando che viene eseguito dentro il ciclo è break
. E il valore di uscita di break
è 0 (vedi:help break
).
Questo è il motivo per cui il tuo programma continua a terminare con 0.