Sintaxis para un bucle while infinito Bash de una sola línea

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

while [ 1 ]
do
    foo
    sleep 2
done

preguntado el 17 de agosto de 09 a las 13:08

reemplace las nuevas líneas con punto y coma. Lo mismo funciona para bucles for. -

@Tom: eso no siempre funciona. después del do, debe tener el primer comando, no un punto y coma -

13 Respuestas

while true; do foo; sleep 2; done

Por cierto, si lo escribe como una línea múltiple (como está mostrando) en el símbolo del sistema y luego llama al historial con la flecha hacia arriba, lo obtendrá en una sola línea, correctamente puntuada.

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

Respondido 17 ago 09, 17:08

"Si lo escribe como una línea múltiple (como está mostrando) en el símbolo del sistema y luego llama al historial con la flecha hacia arriba, lo obtendrá en una sola línea, correctamente puntuada". no era cierto para mí. - Vicente Scheib

@VincentScheib, comprobar cmdhist opción si estás usando bash? - Alok Singhal

¡Excelente! Funciona perfectamente en Mavericks (Mac OS-X 10.9) y me permite mantener una VPN en funcionamiento. Openconnect se desconecta después de unas horas con un error de cookie incorrecta. Así que puse el comando openconnect en un script de shell, sudo su para convertirse en root, y uso esta línea de cmd: while true; do sh /Users/myuser/bin/vpn ; done - Cacahuetes

También es posible usar el comando sleep en la condición while. Haciendo una sola línea con un aspecto más limpio en mi humilde opinión.

while sleep 2; do echo thinking; done

respondido 06 nov., 12:10

Bueno, esto hace más que solo cambiar la sintaxis: ejecutará el comando después de el sueño. En la respuesta anterior, el comando se ejecuta de inmediato. Solo algo para tener en cuenta. - DanGordon

@DanGordon while echo thinking ; do sleep 2 ; done Por supuesto, si el comando [while] falla, el bucle sale, por lo que tendría que while echo thinking || true ; do sleep 2 ; done pero luego estás de vuelta a while true ; ... - Brian Carcich

Colon es siempre "verdadero":

while :; do foo; sleep 2; done

respondido 06 nov., 12:13

¿Por qué el colon siempre es cierto? - Paul Paul

@Pineapple Under the Sea: Desde la página de manual de bash: (en la sección SHELL BUILTIN COMMANDS) : [arguments] Sin efecto; el comando no hace nada más que expandir argumentos y realizar cualquier redirección especificada. Se devuelve un código de salida cero. - Adrian W.

esta sintaxis se recomienda ya que: es parte del propio shell, es decir: es un comando incorporado del shell. - avner

Puede usar punto y coma para separar declaraciones:

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

Respondido 17 ago 09, 17:08

Me gusta esta respuesta porque explica cuándo y por qué; (punto y coma) es obligatorio. - superhedgy

También puedes hacer uso de until mando:

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

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


El uso de un while bucle:

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

El uso de un for bucle:

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

Otra forma de usar until:

until [ ]; do foo; sleep 2; done

Respondido 16 Oct 13, 08:10

El until ((0)); do foo; sleep 2; done no parece funcionar. Es continuo infinito. - 030

Un bucle infinito muy simple .. :)

while true ; do continue ; done

Fr tu pregunta sería:

while true; do foo ; sleep 2 ; done

respondido 26 nov., 16:20

Para un uso sencillo de la observación del proceso watch

Respondido el 14 de diciembre de 16 a las 11:12

Me gusta usar el punto y coma solo para la instrucción WHILE, y el operador && para hacer que el bucle haga más de una cosa ...

Entonces 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

Respondido 30 ago 11, 01:08

Bueno, el uso de && en el bucle es el mismo que en cualquier otro momento realmente no es así. ¿Necesita que suceda lo segundo solo si sucede lo primero, luego use && más ; es suficiente. Realmente, desea mantener el contenido de ese bucle corto y simple, idealmente solo un comando, una función o un script. - elcoshman

Uso cuidadoso de unidades en sleep invasivos, tales como los sleep 1h. En mi zsh, ignora la unidad h y ejecuta mi comando cada 1 segundo. Haz un rapido man sleep para ver cuál es tu entorno sleep El comando admite primero. Puede ahorrarte un dolor de cabeza. - Josué pinter

Gracias por esto. Estaba buscando la forma correcta de ejecutar más de una cosa en el 'hacer' - jjaguirre394

Usar while:

while true; do echo 'while'; sleep 2s; done

Usar for Lazo:

for ((;;)); do echo 'forloop'; sleep 2; done

Usar Recursion, (un poco diferente al anterior, la interrupción del teclado no lo detendrá)

list(){ echo 'recursion'; sleep 2; list; } && list;

contestado el 26 de mayo de 19 a las 05:05

Uso cuidadoso de unidades en sleep invasivos, tales como los sleep 1h. En mi zsh, ignora la unidad h y ejecuta mi comando cada 1 segundo. Haz un rapido man sleep para ver cuál es tu entorno sleep El comando admite primero. Puede ahorrarte un dolor de cabeza. - Josué pinter

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

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

Por ejemplo, si el foo El comando 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. Escribe el guión para salir con 1 cuando se cumpla la condición y salga con 0 cuándo debería ejecutarse de nuevo.

Por ejemplo, digamos que tiene una secuencia de comandos de 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 mas. El siguiente comando le permitirá actualizar filas 100 a la vez con dormir durante 5 segundos entre actualizaciones:

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

Respondido el 18 de enero de 18 a las 02:01

y como saldras? - ALASKA_

Tu haces el foo comando salir con código 1 cuando desee que se interrumpa el ciclo while. Actualicé mi respuesta con un ejemplo. - Sí_yo_yo

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

Esto escribe el nombre de todos los archivos terminados 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 intento contribuir.

Respondido 02 Jul 11, 17:07

@JKnight: para estos ejemplos, ¿no harías ls -1 *.jpg y rm *.jpg - kevin fegan

Ambos no son bucles infinitos ni bucles while. - Marian

También puede probar esto ADVERTENCIA: esto no debe hacer, pero dado que la pregunta es pedir un bucle infinito sin fin ... así es como podría hacerlo.

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

respondido 10 mar '18, 14:03

¿Por qué harías eso? - gniourf_gniourf

porque Brian Deacon, que publicó la pregunta, quería como un bucle infinito. Es más de una forma de despellejar a un gato, eso es todo ... grepito

¿Por qué no debería hacerlo? - TheTechRobo36414519

Ni siquiera necesitas usar do y done. Para bucles infinitos, lo encuentro más legible de usar for con llaves. Por ejemplo:

for ((;;)) { date ; sleep 1 ; }

Esto funciona en bash y zsh. No funciona en sh.

respondido 25 nov., 20:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.