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 while
deve ser TRUE
ou 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 TRUE
ou 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, cmd
sempre, como :
sempre, retorna sucesso. Esse é opara semprelaço. Você poderia usar o true
comando para torná-lo mais legível:
while true; do cmd; done
As pessoas costumavam preferir :
o que :
sempre foi incorporado, mas true
não foi (há muito tempo; a maioria dos shells são true
incorporados 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...; done
já 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 true
or false
nã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 false
das 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 continue
instruções break
dentro do loop para controlá-lo ou para mover a condição para o final do loop como uma do ... while
construçã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 while
loop (assim como o if
condicional) 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 help
builtin é ainda mais claro:
$ help :
[...]
No effect; the command does nothing
Exit Status:
Always succeeds.