¿Qué significa "mientras:;" ¿significar?

¿Qué significa "mientras:;" ¿significar?

Sé lo que whilees un bucle. 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 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 TRUEo 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 cmduna y otra vez para siempre como :siempre regresa el éxito. Eso espara siemprebucle. Podrías usar el truecomando en su lugar para hacerlo más legible:

while true; do cmd; done

La gente solía preferir :que :siempre estuviera integrado mientras que trueno lo estaba (hace mucho tiempo; la mayoría de los shells están trueintegrados 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...; doneya 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.whileuntil


¹ :también es más corto y acepta argumentos (que ignora). Mientras que el comportamiento de trueo falseno 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 falselas 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 continuedeclaraciones breakdentro del bucle para controlarlo o mover la condición al final del bucle como una do ... whileconstrucció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 whilebucle (así como el ifcondicional) 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 helpincorporado es aún más claro:

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.

información relacionada