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 comandos:
while [ 1 ]
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 línea desde la línea de comandos:
while [ 1 ]
do
foo
sleep 2
done
Respuestas:
while true; do foo; sleep 2; done
Por cierto, si lo escribe como una línea múltiple (como se muestra) en el símbolo del sistema y luego llama al historial con la flecha hacia arriba, lo obtendrá en una sola línea, puntuada correctamente.
$ while true
> do
> echo "hello"
> sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do echo "hello"; sleep 2; done
cmdhist
opción si está usando bash?
while true; do sh /Users/myuser/bin/vpn ; done
También es posible usar el comando dormir en la condición de while. Hacer que una línea se vea más limpia en mi humilde opinión.
while sleep 2; do echo thinking; done
while echo thinking ; do sleep 2 ; done
Por supuesto, si el comando [while] falla, el ciclo se cierra, por lo que tendría que hacerlo, while echo thinking || true ; do sleep 2 ; done
pero luego volverá awhile true ; ...
Colón siempre es "verdadero":
while :; do foo; sleep 2; done
: [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.
Puede usar punto y coma para separar las declaraciones:
$ while [ 1 ]; do foo; sleep 2; done
También puede hacer uso del until
comando:
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.
Usando un while
bucle:
while read i; do foo; sleep 2; done < /dev/urandom
Usando un for
bucle:
for ((;;)); do foo; sleep 2; done
Otra forma de usar until
:
until [ ]; do foo; sleep 2; done
until ((0)); do foo; sleep 2; done
no parece funcionar. Es continuo infinito.
Me gusta usar los puntos y comas solo para la instrucción WHILE, y el operador && para hacer que el ciclo 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
&&
in the loop es el mismo que en cualquier otro momento, ¿verdad? ¿Necesita la segunda cosa que suceda sólo si el primer pase, a continuación, utilizar &&
lo demás ;
es suficiente. Realmente, desea mantener el contenido de ese ciclo corto y simple, idealmente solo un comando, una función o un script.
Para ver el proceso simple, use watch
en su lugar
Utilizando while
:
while true; do echo 'while'; sleep 2s; done
Usando for
Loop:
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;
Si desea que el ciclo while se detenga después de alguna condición, y su foo
comando devuelve un valor distinto de cero cuando se cumple esta condición, puede hacer que el ciclo se rompa así:
while foo; do echo 'sleeping...'; sleep 5; done;
Por ejemplo, si el foo
comando está eliminando cosas en lotes, y devuelve 1 cuando no queda nada para eliminar.
Esto funciona bien si tiene un script personalizado que necesita ejecutar un comando muchas veces hasta que se presente alguna condición. Usted escribe el script para salir 1
cuando se cumple la condición y salir 0
cuando se debe ejecutar nuevamente.
Por ejemplo, supongamos que tiene un script 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 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;
foo
comando salga con código 1
cuando desea que se rompa el bucle while. He actualizado mi respuesta con un ejemplo.
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 elimina:
for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done
Solo trato de contribuir.
ls -1 *.jpg
yrm *.jpg
También puede probar esto ADVERTENCIA: esto no debe hacerlo, pero dado que la pregunta es un bucle infinito sin fin ... así es como podría hacerlo.
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done