¿Algo así?
while true; do
case $RANDOM in *0) exit 27 ;; esac
done
¿O así?
rc=0
for file in *; do
grep fnord "$file" || rc=$?
done
exit $rc
La verdadera pregunta es decidir si el código de salida del bucle debe ser un éxito o un fracaso si falla una iteración. Hay escenarios en los que uno tiene más sentido que el otro y otros en los que no está nada claro.
El estado del bucle es el estado del último comando que se ejecuta. Puede usar break para salir del ciclo, pero si la ruptura es exitosa, entonces el estado del ciclo será 0
. Sin embargo, puede usar una subcapa y salir en lugar de interrumpir. En otras palabras:
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
También podría poner el bucle en una función y devolver un valor de ella. por ejemplo:
in() { local c="$1"; shift; for i; do test "$i" = "$c" && return 0; done; return 1; }
El manual de 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.[..]
El último comando que se ejecuta dentro el ciclo es break
. Y el valor de salida de break
es 0 (ver:help break
).
Esta es la razón por la que su programa sigue saliendo con 0.