Sé lo que es un while
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 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 TRUE
o 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 untrue
ejecutable).:
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
cmd
una y otra vez para:
siempre como siempre devuelve el éxito. Ese es el ciclo para siempre . En su lugar, podría usar eltrue
comando para hacerlo más legible:La gente solía preferir
:
como:
siempre se construyó mientras quetrue
no se hizo (hace mucho tiempo; la mayoría de las conchas se hantrue
construido 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...; 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 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 detrue
ofalse
no 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
false
implementaciones / 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 :; done
while :
se usa generalmente si desea hacer algo repetidamente sin una condición especial adjunta. Es posible utilizarcontinue
,break
declaraciones dentro del bucle de controlarlo o para mover la condición al final del bucle como undo ... while
constructo.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
while
bucle (así como elif
condicional) 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
help
construcción es aún más clara:fuente
s/any command/any sequence of commands/
, como Stéphane deja claro.