while true loop bash loops while-loop

true - sleep bash



Sintaxis para un bucle Bash infinite while de una sola lĂ­nea (11)

El colon es siempre "verdadero":

while :; do foo; sleep 2; done

Tengo problemas para encontrar la combinación correcta de punto y coma y / o llaves. Me gustaría hacer esto, pero como una sola línea desde la línea de comandos:

while [ 1 ] do foo sleep 2 done


Me gusta usar los puntos y coma solo para la declaración WHILE, y el operador && hace que el bucle haga más de una cosa ...

Así que siempre lo hago así.

while true ; do echo Launching Spaceship into orbit && sleep 5s && /usr/bin/launch-mechanism && echo Launching in T-5 && sleep 1s && echo T-4 && sleep 1s && echo T-3 && sleep 1s && echo T-2 && sleep 1s && echo T-1 && sleep 1s && echo liftoff ; done


Para ver el proceso simple, use el watch lugar.


Puede utilizar puntos y coma para separar declaraciones:

$ while [ 1 ]; do foo; sleep 2; done


Si desea que el bucle while se detenga después de alguna condición, y su comando foo devuelve un valor distinto de cero cuando se cumple esta condición, puede hacer que el bucle se rompa así:

while foo; do echo ''sleeping...''; sleep 5; done;

Por ejemplo, si el comando foo está eliminando cosas en lotes, y devuelve 1 cuando no queda nada por eliminar.

Esto funciona bien si tiene un script personalizado que necesita ejecutar un comando muchas veces hasta que se cumpla alguna condición. Usted escribe el script para salir con 1 cuando se cumple la condición y sale con 0 cuando debería ejecutarse nuevamente.

Por ejemplo, supongamos que tiene un script en python batch_update.py que actualiza 100 filas en una base de datos y devuelve 0 si hay más para actualizar y 1 si no hay más. El siguiente comando le permitirá actualizar las filas 100 a la vez con dormir durante 5 segundos entre actualizaciones:

while batch_update.py; do echo ''sleeping...''; sleep 5; done;


Si puedo dar dos ejemplos prácticos (con un poco de "emoción").

Esto escribe el nombre de todos los archivos que terminaron con ".jpg" en la carpeta "img":

for f in *; do if [ "${f#*.}" == ''jpg'' ]; then echo $f; fi; done

Esto los borra:

for f in *; do if [ "${f#*.}" == ''jpg'' ]; then rm -r $f; fi; done

Solo tratando de contribuir.


También es posible usar el comando de dormir en la condición de while. Haciendo que una sola línea se vea más limpia.

while sleep 2; do echo thinking; done


También puedes intentar esto. ADVERTENCIA: esto no deberías hacerlo, pero como la pregunta es hacer un bucle infinito sin final ... así es como puedes hacerlo.

while [[ 0 -ne 1 ]]; do echo "it''s looping"; sleep 2; done


También puedes utilizar until comando:

until ((0)); do foo; sleep 2; done

Tenga en cuenta que en contraste con while , until se ejecuten los comandos dentro del bucle siempre que la condición de prueba tenga un estado de salida que no sea cero.

Usando un bucle while:

while read i; do foo; sleep 2; done < /dev/urandom

Usando un bucle for :

for ((;;)); do foo; sleep 2; done

Otra forma de usar until :

until [ ]; do foo; sleep 2; done


Un bucle infinito muy simple ... :)

while true ; do continue ; done

Fr su pregunta sería:

while true; do foo ; sleep 2 ; done


while true; do foo; sleep 2; done

Por cierto, si lo escribe como multilínea (como lo muestra) en el símbolo del sistema y luego llama el historial con la flecha hacia arriba, lo obtendrá en una sola línea, correctamente puntuado.

$ while true > do > echo "hello" > sleep 2 > done hello hello hello ^C $ <arrow up> while true; do echo "hello"; sleep 2; done