Sé lo que while
es un bucle. Sin embargo, solo lo he visto funcionar con:
while [condition]
while ![condition]
while TRUE (infinite loop)
Donde la declaración posterior while
tiene que ser TRUE
o FALSE
.
Hay un comando integrado del shell llamado :
. Se describe como un comando ficticio que no hace nada, pero no sé si es lo mismo aquí, incluso si puede ser TRUE
o FALSE
. Quizás sea algo diferente, pero ¿qué?
Respuesta1
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 (es decir, la última ejecución en esa lista) sea exitosa.
En esoprimera lista de comandos, puedes usar el [
comando para realizar varios tipos de pruebas, o puedes usar el :
comando nulo que no hace nada y devuelve éxito, o cualquier otro comando.
while :; do cmd; done
Corre cmd
una y otra vez para siempre como :
siempre regresa el éxito. Eso espara siemprebucle. Podrías usar el true
comando en su lugar para hacerlo más legible:
while true; do cmd; done
La gente solía preferir :
que :
siempre estuviera integrado mientras que true
no lo estaba (hace mucho tiempo; la mayoría de los shells están true
integrados hoy en día)¹.
Otras variantes que podrías 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 verdadera también)
while ((1)); do cmd; done
Usando la sintaxis Korn/bash/zsh ((...))
para imitar la while(1) { ...; }
de C.
O otros más complicados como until false; do cmd; done
, until ! true
...
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 unalistade comandos. Por ejemplo, ves gente escribiendo:
while :; do
cmd1
cmd2 || break
cmd3
done
Cuando podrían haber escrito:
while
cmd1
cmd2
do
cmd3
done
Tiene sentido que sea unlistawhile cmd1 && cmd2; do...; done
ya que a menudo también desea hacer cosas como listas de comandos.
En cualquier caso, tenga en cuenta que es [
un comando como cualquier otro (aunque está integrado en shells modernos tipo Bourne), no tiene que usarse únicamente en las listas de condiciones if
// , y esas listas de condiciones no tienen usar ese comando más que cualquier otro comando.while
until
¹ :
también es más corto y acepta argumentos (que ignora). Mientras que el comportamiento de true
o false
no se especifica si le pasa algún argumento. Entonces se 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 false
las implementaciones/shell).
Respuesta2
while :
es un bucle infinito. :
simplemente no hace nada (con éxito).
Entonces, si desea que su shell se cuelgue para siempre sin hacer nada, puede escribirlo como
while :
do
:
done
O en una sola línea con ;
en lugar de nuevas líneas:while :; do :; done
while :
Generalmente se usa si desea hacer algo repetidamente sin una condición especial adjunta. Puede usar continue
declaraciones break
dentro del bucle para controlarlo o mover la condición al final del bucle como una do ... while
construcción.
Respuesta3
sin embargo, la afirmación después de un tiempo debe ser VERDADERA o FALSA.
No, el comando en la parte de condición puede ser cualquier comando (*) .TodoLos comandos de shell tienen algún valor de retorno, y el while
bucle (así como el if
condicional) toma los valores de retorno de cero como "verdaderos" y todos los demás como "falso". (*o una lista de varios comandos, el último cuenta)
Como para :
,manual de bashdice claramente cuál es el estado de devolución de eso:
: [arguments]
No haga nada más que expandir argumentos y realizar redirecciones. El estado de devolución es cero.
El help
incorporado es aún más claro:
$ help :
[...]
No effect; the command does nothing
Exit Status:
Always succeeds.