GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo obtener el estado de salida de un bucle en bash

¿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.


Linux
  1. ¿Cómo suprimir la salida de Grep, para que solo devuelva el estado de salida?

  2. ¿Cómo obtener el Tty en el que se está ejecutando Bash?

  3. Bash + ¿Cómo salir del script secundario y del script principal en ambas ocasiones?

  4. ¿Cómo evaluará Bash el siguiente código?

  5. ¿Cómo obtener el estado de salida de un comando de shell utilizado en GNU Makefile?

Bash continue:Cómo reanudar un bucle

Cómo usar el comando de lectura Bash

Bash break:cómo salir de un bucle

Cómo obtener el tamaño de un directorio en Linux

El Bash FOR Loop explicado y simplificado

Bash:Bucle hasta que el estado de salida del comando sea igual a 0