Como sair de um loop no Bash?

150

Quero escrever um script Bash para processar o texto, o que pode exigir um loop while.

Por exemplo, um loop while em C:

int done = 0;
while(1) {
  ...
  if(done) break;
}

Eu quero escrever um script Bash equivalente a isso. Mas o que eu normalmente usava e, como todos os exemplos clássicos que li, é o seguinte:

while read something;
do
...
done

Ele não oferece ajuda sobre como fazer while(1){}e break;, que é bem definido e amplamente usado em C, e não preciso ler dados para o stdin.

Alguém poderia me ajudar com um equivalente Bash do código C acima?

lulyon
fonte

Respostas:

189

Não é tão diferente assim bash.

done=0
while : ; do
  ...
  if [ "$done" -ne 0 ]; then
      break
  fi
done

:é o comando no-op; seu status de saída é sempre 0, então o loop é executado até donereceber um valor diferente de zero.


Existem várias maneiras pelas quais você pode definir e testar o valor donepara sair do loop; o que mostro acima deve funcionar em qualquer shell compatível com POSIX.

chepner
fonte
Não há problema em usar donecomo um nome de variável? É uma palavra-chave shell ... meio que confusa, no mínimo.
Michael Dorst
59
while true ; do
    ...
    if [ something ]; then
        break
    fi
done
espreitador
fonte