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
).