¿Cómo salir de un bucle en Bash?

150

Quiero escribir un script Bash para procesar texto, lo que puede requerir un ciclo while.

Por ejemplo, un ciclo while en C:

int done = 0;
while(1) {
  ...
  if(done) break;
}

Quiero escribir un script Bash equivalente a eso. Pero lo que solía usar y, como han demostrado todos los ejemplos clásicos que leí, es este:

while read something;
do
...
done

No ofrece ayuda sobre cómo hacerlo while(1){}y break;, que está bien definido y ampliamente utilizado en C, y no tengo que leer datos para stdin.

¿Alguien podría ayudarme con un Bash equivalente al código C anterior?

lulyon
fuente

Respuestas:

189

No es tan diferente en bash.

done=0
while : ; do
  ...
  if [ "$done" -ne 0 ]; then
      break
  fi
done

:es el comando no-op; su estado de salida es siempre 0, por lo que el ciclo se ejecuta hasta que donese le da un valor distinto de cero.


Hay muchas formas de establecer y probar el valor de donepara salir del ciclo; el que muestro arriba debería funcionar en cualquier shell compatible con POSIX.

chepner
fuente
¿Está bien usarlo donecomo nombre de variable? Es una palabra clave de shell ... Al menos confusa.
Michael Dorst
59
while true ; do
    ...
    if [ something ]; then
        break
    fi
done
mirón
fuente