O que significa "enquanto :;" significar?

O que significa "enquanto :;" significar?

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

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

Onde a instrução depois whiledeve ser TRUEou FALSE.

Existe um comando interno do shell chamado :. É descrito como um comando fictício que não faz nada, mas não sei se é o mesmo aqui, mesmo que possa ser TRUEou FALSE. Talvez seja algo diferente, mas o quê?

Responder1

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 (ou seja, a última execução dessa lista) seja bem-sucedida.

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

while :; do cmd; done

Repetidamente, cmdsempre, como :sempre, retorna sucesso. Esse é opara semprelaço. Você poderia usar o truecomando para torná-lo mais legível:

while true; do cmd; done

As pessoas costumavam preferir :o que :sempre foi incorporado, mas truenão foi (há muito tempo; a maioria dos shells são trueincorporados hoje em dia)¹.

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 (portanto, sempre verdadeira também)

while ((1)); do cmd; done

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

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

Às vezes, eles têm alias como:

alias forever='while :; do'

Então você pode fazer algo como:

forever cmd; done

Poucas pessoas percebem que a condição é umalistade 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 umlistawhile cmd1 && cmd2; do...; donejá que muitas vezes você também deseja fazer coisas como listas de comandos.

Em qualquer caso, observe que [é um comando como qualquer outro (embora esteja embutido em shells modernos do tipo Bourne), ele não precisa ser usado apenas nas listas de condições if/ while/ until, e essas listas de condições não têm usar esse comando mais do que qualquer outro comando.


¹ :também é mais curto e aceita argumentos (que ignora). Embora o comportamento de trueor falsenão seja especificado se você passar algum 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 falsedas implementações/shell).

Responder2

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

Então, se você quiser que sua concha fique pendurada para sempre sem fazer nada, você pode escrevê-la como

while :
do
    :
done

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

while :geralmente é usado se você quiser fazer algo repetidamente sem uma condição especial anexada. Você pode usar continueinstruções breakdentro do loop para controlá-lo ou para mover a condição para o final do loop como uma do ... whileconstrução.

Responder3

entretanto, a declaração após while deve ser VERDADEIRA ou FALSA.

Não, o comando na parte da condição pode ser qualquer comando (*) .Todoscomandos shell têm algum valor de retorno, e o whileloop (assim como o ifcondicional) assume 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 Bashdiz claramente qual é o status de retorno disso:

: [arguments]
Não faça nada além de expandir argumentos e realizar redirecionamentos. O status de retorno é zero.

O helpbuiltin é ainda mais claro:

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

informação relacionada