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 (portanto, a última execução nessa lista) seja bem-sucedida.
Na primeira lista de comandos , você pode usar o [comando para fazer vários tipos de testes ou o :comando nulo que não faz nada e retorna sucesso, ou qualquer outro comando.
while :; do cmd; done
Corre cmdrepetidamente para sempre, como :sempre retorna sucesso. Esse é o laço eterno . Você poderia usar o truecomando para torná-lo mais legível:
while true; do cmd; done
As pessoas costumavam preferir o :que :sempre foi construído, enquanto truenão era (há muito tempo; a maioria das conchas já foi trueconstruída hoje em dia) ¹.
Outras variantes que você pode ver:
while [ 1 ]; do cmd; done
Acima, chamamos o [comando para testar se a sequência "1" não está vazia (portanto, sempre também verdadeira)
while ((1)); do cmd; done
Usando a ((...))sintaxe Korn / bash / zsh para imitar o while(1) { ...; }de C.
Ou as mais complicadas gosto until false; do cmd; done, until ! true...
Às vezes, esses são apelidos como:
alias forever='while :; do'
So you can do something like:
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, pois muitas vezes você também deseja fazer coisas como while cmd1 && cmd2; do...; donelistas de comandos.
De qualquer forma, observe que [é um comando como outro qualquer (embora esteja embutido em shells modernos do tipo Bourne), ele não precisa ser usado apenas nas listas de condições if/ while/ untile essas listas de condições não têm para usar esse comando mais do que qualquer outro comando.
Also :também é mais curto e aceita argumentos (que são ignorados). Enquanto o comportamento de trueou falsenão for 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 das shell / falseimplementações).
:não faz nada, mas sempre sai com o código de retorno 0. Portanto, é o mesmo que erawhile true(assumindo que seu sistema possui umtrueexecutável).