O que significa "while:;"?

25

Eu sei o que é um while loop. No entanto, só vi funcionar com:

while [condition]
while ![condition]
while TRUE (infinite loop)

Onde a declaração após while precisa ser TRUE ou FALSE .

Existe um comando interno do shell denominado : . Ele é descrito como um comando fictício que não faz nada, mas não sei se é o mesmo aqui, mesmo que possa ser TRUE ou FALSE . Talvez seja algo diferente, mas o que?

    
por sharkant 25.05.2017 / 08:32

3 respostas

50

A sintaxe é:

while
  first list of commands
do
  second list of commands
done

que executa a segunda lista de comandos em um loop, desde que a primeira lista de comandos (para que a última execução nessa lista) seja bem-sucedida.

Nessa primeira lista de comandos , você pode usar o comando [ para fazer vários tipos de testes ou usar o comando : null que não faz nada e retorna sucesso, ou qualquer outro comando.

while :; do cmd; done

Executa cmd repetidamente, pois : sempre retorna sucesso. Esse é o loop para sempre . Você poderia usar o comando true para torná-lo mais legível:

while true; do cmd; done

As pessoas costumavam preferir : como : sempre foi construído enquanto true não era (há muito tempo; a maioria das shells tem true embutido atualmente) <.

Outras variantes que você pode ver:

while [ 1 ];  do cmd; done

Acima, estamos chamando o comando [ para testar se a string "1" não está vazia (então sempre é verdade também)

while ((1)); do cmd; done

Usando a sintaxe Korn / bash / zsh ((...)) para imitar o while(1) { ...; } de C.

Ou mais complicados como until false; do cmd; done , until ! true ...

Às vezes, elas são postas como:

alias forever='while :; do'

Então você pode fazer algo como:

forever cmd; done

Poucas pessoas percebem que a condição é uma lista de comandos. Por exemplo, você vê pessoas escrevendo:

while :; do
  cmd1
  cmd2 || break
  cmd3
done

Quando eles poderiam ter escrito:

while
  cmd1
  cmd2
do
  cmd3
done

Faz sentido que seja uma lista , já que muitas vezes você quer fazer coisas como while cmd1 && cmd2; do...; done , que também são listas de comandos.

Em qualquer caso, observe que [ é um comando como qualquer outro (embora esteja embutido em shells modernos semelhantes a Bourne), ele não precisa ser usado somente no if / while / until condition lists, e essas listas de condição não precisam usar esse comando mais do que qualquer outro comando.

¹ : também é mais curto e aceita argumentos (que ignora). Embora o comportamento de true ou false não seja especificado, se você passar qualquer argumento. Então, pode-se fazer, por exemplo:

while : you wait; do
  something
done

Mas o comportamento de:

until false is true; do
  something
done

não é especificado (embora funcione na maioria das implementações shell / false ).

    
por 25.05.2017 / 08:47
12

while : é um loop infinito. : simplesmente não faz nada (com sucesso).

Então, se você quiser que seu shell permaneça sem fazer nada, você pode escrevê-lo como

while :
do
    :
done

Ou em uma única linha com ; em vez de novas linhas: while :; do :; done

while : é normalmente usado se você quiser fazer algo repetidamente sem uma condição especial anexada. Você pode usar as declarações continue , break dentro do loop para controlá-lo ou mover a condição para o final do loop como uma construção do ... while .

    
por 25.05.2017 / 08:47
12

howsoever, the statement after while has to be either TRUE or FALSE.

Não, o comando na parte de condição pode ser qualquer comando (*) . Todos os comandos shell possuem algum valor de retorno, e o while loop (assim como o if condicional) toma valores de retorno zero como "true", e todos os outros como "false". (* ou uma lista de vários comandos, o último conta)

Quanto a : , Manual do Bash diz claramente qual é o status de retorno disso:

: [arguments]
Do nothing beyond expanding arguments and performing redirections. The return status is zero.

O help incorporado é ainda mais claro:

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.
    
por 25.05.2017 / 08:52