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