La sintaxis es:
while
first list of commands
do
second list of commands
done
que ejecuta la segunda lista de comandos en un bucle siempre que la primera lista de comandos (por lo que la última ejecución de esa lista) sea exitosa.
En esa primera lista de comandos , puede usar el [
comando para hacer varios tipos de pruebas, o puede usar el :
comando nulo que no hace nada y devuelve el éxito, o cualquier otro comando.
while :; do cmd; done
Corre cmd
una y otra vez para :
siempre como siempre devuelve el éxito. Ese es el ciclo para siempre . En su lugar, podría usar el true
comando para hacerlo más legible:
while true; do cmd; done
La gente solía preferir :
como :
siempre se construyó mientras que true
no se hizo (hace mucho tiempo; la mayoría de las conchas se han true
construido hoy en día) ¹.
Otras variantes que puede ver:
while [ 1 ]; do cmd; done
Arriba, llamamos al [
comando para probar si la cadena "1" no está vacía (por lo que siempre es así también)
while ((1)); do cmd; done
Usando la ((...))
sintaxis de Korn / bash / zsh para imitar la while(1) { ...; }
de C.
O más contorneados aquellos como until false; do cmd; done
, until ! true
...
Esos a veces tienen alias como:
alias forever='while :; do'
Entonces puedes hacer algo como:
forever cmd; done
Pocas personas se dan cuenta de que la condición es una lista de comandos. Por ejemplo, ves personas escribiendo:
while :; do
cmd1
cmd2 || break
cmd3
done
Cuando podrían haber escrito:
while
cmd1
cmd2
do
cmd3
done
Tiene sentido que sea una lista, ya que a menudo también quieres hacer cosas como while cmd1 && cmd2; do...; done
las listas de comandos.
En cualquier caso, tenga en cuenta que [
es un comando como cualquier otro (aunque está integrado en los shells modernos tipo Bourne), no tiene que usarse únicamente en las listas de condiciones if
/ while
/ until
, y esas listas de condiciones no tienen usar ese comando más que cualquier otro comando.
¹ :
también es más corto y acepta argumentos (que ignora). Si bien el comportamiento de true
o false
no se especifica si le pasa algún argumento. Entonces uno puede hacer, por ejemplo:
while : you wait; do
something
done
Pero, el comportamiento de:
until false is true; do
something
done
no está especificado (aunque funcionaría en la mayoría de las false
implementaciones / shell ).
:
no hace nada pero siempre sale con el código de retorno 0. Por lo tanto, es lo mismowhile true
(suponiendo que su sistema tenga untrue
ejecutable).