Jak wyrwać się z pętli w Bashu?

150

Chcę napisać skrypt Bash do przetwarzania tekstu, co może wymagać pętli while.

Na przykład pętla while w C:

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

Chcę napisać odpowiednik tego skryptu w Bash. Ale to, czego zwykle używałem i jak pokazały wszystkie klasyczne przykłady, które przeczytałem, to:

while read something;
do
...
done

Nie oferuje żadnej pomocy, jak to zrobić while(1){}i break;, co jest dobrze zdefiniowane i szeroko stosowane w C, i nie muszę czytać danych dla stdin.

Czy ktoś mógłby mi pomóc z odpowiednikiem Bash powyższego kodu C?

lulyon
źródło

Odpowiedzi:

189

Nie jest tak inaczej bash.

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

:jest poleceniem no-op; jego kod wyjścia zawsze wynosi 0, więc pętla działa, dopóki donenie otrzyma wartości niezerowej.


Jest wiele sposobów na ustawienie i przetestowanie wartości donew celu wyjścia z pętli; ten, który pokazałem powyżej, powinien działać w dowolnej powłoce zgodnej z POSIX.

Chepner
źródło
Czy można używać donejako nazwy zmiennej? To słowo kluczowe powłoki ... przynajmniej trochę mylące.
Michael Dorst
59
while true ; do
    ...
    if [ something ]; then
        break
    fi
done
czai się
źródło