Składnia jest następująca:
while
first list of commands
do
second list of commands
done
która uruchamia drugą listę poleceń w pętli, o ile pierwsza lista poleceń (czyli ostatnie uruchomienie na tej liście) zakończyła się powodzeniem.
Na pierwszej liście poleceń możesz użyć [
polecenia do wykonania różnego rodzaju testów lub możesz użyć :
polecenia zerowego, które nic nie robi i zwraca sukces, lub dowolnego innego polecenia.
while :; do cmd; done
Działa w cmd
kółko na zawsze, jak :
zawsze zwraca sukces. To jest pętla na zawsze . Zamiast tego możesz użyć true
polecenia, aby uczynić go bardziej czytelnym:
while true; do cmd; done
Ludzie woleli, :
jak :
zawsze było wbudowane, podczas gdy true
nie było (dawno temu; większość powłok ma true
wbudowane obecnie) ¹.
Inne warianty, które możesz zobaczyć:
while [ 1 ]; do cmd; done
Powyżej wywołujemy [
polecenie, aby sprawdzić, czy ciąg „1” nie jest pusty (więc zawsze również prawda)
while ((1)); do cmd; done
Używanie ((...))
składni Korn / bash / zsh do naśladowania while(1) { ...; }
C.
Lub bardziej zawiłych podoba ci until false; do cmd; done
, until ! true
...
Są one czasami aliasowane:
alias forever='while :; do'
Możesz więc zrobić coś takiego:
forever cmd; done
Niewiele osób zdaje sobie sprawę, że warunkiem jest lista poleceń. Na przykład widzisz ludzi piszących:
while :; do
cmd1
cmd2 || break
cmd3
done
Kiedy mogliby napisać:
while
cmd1
cmd2
do
cmd3
done
Ma sens, aby była to lista, ponieważ często chcesz robić takie rzeczy, jak while cmd1 && cmd2; do...; done
listy poleceń.
W każdym razie pamiętaj, że [
jest to polecenie jak każde inne (chociaż jest wbudowane w nowoczesne powłoki podobne do Bourne'a), nie musi być używane wyłącznie na listach if
/ while
/ until
condition, a te listy warunków nie mają używać tego polecenia bardziej niż jakiegokolwiek innego polecenia.
¹ :
jest również krótszy i przyjmuje argumenty (które ignoruje). Podczas gdy zachowanie true
lub false
jest nieokreślone, jeśli przekażesz mu dowolny argument. Można więc na przykład:
while : you wait; do
something
done
Ale zachowanie:
until false is true; do
something
done
jest nieokreślony (choć działałoby w większości powłok / false
implementacji).
:
nic nie robi, ale zawsze kończy działanie z kodem powrotu 0. Tak samo byłowhile true
(zakładając, że twój system matrue
plik wykonywalny).