2013-08-28 22 views
47

Chcę napisać skrypt Bash do przetwarzania tekstu, który może wymagać pętli while.Jak wyjść z pętli w Bash?

Na przykład pętli while w C:

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

Chcę napisać odpowiednik skryptu Bash do tego. Ale to, co zazwyczaj używane i jak wszystkie klasyczne przykłady czytałem wykazały, jest taka:

while read something; 
do 
... 
done 

oferuje żadnej pomocy na temat jak to zrobić while(1){} i break;, który jest dobrze zdefiniowany i powszechnie używany w C, a ja nie trzeba czytać danych dla stdin.

Czy ktoś może mi pomóc z odpowiednikiem Bash powyższego kodu C?

Odpowiedz

66

To nie jest tak różne w bash.

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

: jest polecenie nie-PO; jego kod wyjścia ma zawsze wartość 0, więc pętla działa, dopóki done nie uzyska wartości zero.


Istnieje wiele sposobów można ustawić i przetestować wartość done aby wyjść z pętli; ten, który pokazałem powyżej, powinien działać w dowolnej powłoce zgodnej z POSIX.

25
while true ; do 
    ... 
    if [ something ]; then 
     break 
    fi 
done 
+1

Nie potrzebujesz nawiasów wokół "true". – chepner

+0

Dzięki @chepner, bardzo zobowiązany. – lurker

+0

Dziękuję. Twoja odpowiedź jest właściwa, ale mogę zaakceptować tylko jedną. Zasługujesz na uprowadzenie. – lulyon