Sé lo que es un whilebucle. Sin embargo, solo lo he visto funcionar con:
while [condition]
while ![condition]
while TRUE (infinite loop)
Donde la declaración posterior whiletiene que ser TRUEo FALSE.
Hay un comando incorporado de shell llamado :. Se describe como un comando ficticio que no hace nada, pero no sé si es lo mismo aquí, incluso si puede ser TRUEo FALSE. Quizás es algo diferente, pero ¿qué?
bash
shell-script
Sharkant
fuente
fuente

: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 untrueejecutable).:comando nunca se ejecuta, no devolverá 0. Sin embargo, eso es demasiado pedante en mi opinión.Respuestas:
La sintaxis es:
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.Corre
cmduna y otra vez para:siempre como siempre devuelve el éxito. Ese es el ciclo para siempre . En su lugar, podría usar eltruecomando para hacerlo más legible:La gente solía preferir
:como:siempre se construyó mientras quetrueno se hizo (hace mucho tiempo; la mayoría de las conchas se hantrueconstruido hoy en día) ¹.Otras variantes que puede ver:
Arriba, llamamos al
[comando para probar si la cadena "1" no está vacía (por lo que siempre es así también)Usando la
((...))sintaxis de Korn / bash / zsh para imitar lawhile(1) { ...; }de C.O más contorneados aquellos como
until false; do cmd; done,until ! true...Esos a veces tienen alias como:
Entonces puedes hacer algo como:
Pocas personas se dan cuenta de que la condición es una lista de comandos. Por ejemplo, ves personas escribiendo:
Cuando podrían haber escrito:
Tiene sentido que sea una lista, ya que a menudo también quieres hacer cosas como
while cmd1 && cmd2; do...; donelas 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 condicionesif/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 detrueofalseno se especifica si le pasa algún argumento. Entonces uno puede hacer, por ejemplo:Pero, el comportamiento de:
no está especificado (aunque funcionaría en la mayoría de las
falseimplementaciones / shell ).fuente
while :Es un bucle infinito.:simplemente no hace nada (con éxito).Entonces, si desea que su caparazón se cuelgue para siempre sin hacer nada, puede escribirlo como
O en una sola línea con en
;lugar de nuevas líneas:while :; do :; donewhile :se usa generalmente si desea hacer algo repetidamente sin una condición especial adjunta. Es posible utilizarcontinue,breakdeclaraciones dentro del bucle de controlarlo o para mover la condición al final del bucle como undo ... whileconstructo.fuente
No, el comando en la parte de condición puede ser cualquier comando (*) . Todos los comandos de shell tienen algún valor de retorno, y el
whilebucle (así como elifcondicional) toma los valores de retorno de cero como "verdadero", y todos los demás como "falso". (* o una lista de varios comandos, el último cuenta)En cuanto a
:, el manual de Bash dice claramente cuál es el estado de devolución de eso:La
helpconstrucción es aún más clara:fuente
s/any command/any sequence of commands/, como Stéphane deja claro.