Wiem, co to while
jest pętla. Widziałem jednak, że działa tylko z:
while [condition]
while ![condition]
while TRUE (infinite loop)
W przypadku gdy oświadczenie po while
musi być TRUE
albo FALSE
.
Istnieje wbudowane polecenie powłoki o nazwie :
. Jest to opisywane jako fikcyjne polecenie, które nic nie robi, ale nie wiem, czy tutaj jest tak samo, nawet jeśli może to być TRUE
lub FALSE
. Może to coś innego, ale co?
bash
shell-script
rekin
źródło
źródło
:
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).:
polecenie nigdy nie zostanie wykonane, nie zwróci 0. To jednak zbyt pedantyczne.Odpowiedzi:
Składnia jest następująca:
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.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:Ludzie woleli,
:
jak:
zawsze było wbudowane, podczas gdytrue
nie było (dawno temu; większość powłok matrue
wbudowane obecnie) ¹.Inne warianty, które możesz zobaczyć:
Powyżej wywołujemy
[
polecenie, aby sprawdzić, czy ciąg „1” nie jest pusty (więc zawsze również prawda)Używanie
((...))
składni Korn / bash / zsh do naśladowaniawhile(1) { ...; }
C.Lub bardziej zawiłych podoba ci
until false; do cmd; done
,until ! true
...Są one czasami aliasowane:
Możesz więc zrobić coś takiego:
Niewiele osób zdaje sobie sprawę, że warunkiem jest lista poleceń. Na przykład widzisz ludzi piszących:
Kiedy mogliby napisać:
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 listachif
/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 zachowanietrue
lubfalse
jest nieokreślone, jeśli przekażesz mu dowolny argument. Można więc na przykład:Ale zachowanie:
jest nieokreślony (choć działałoby w większości powłok /
false
implementacji).źródło
while :
jest nieskończoną pętlą.:
po prostu nic nie robi (z powodzeniem).Jeśli więc chcesz, aby twoja powłoka zawsze wisiała bezczynnie, możesz napisać ją jako
Lub w jednym wierszu z
;
zamiast nowych linii:while :; do :; done
while :
jest zwykle używany, jeśli chcesz zrobić coś wielokrotnie bez specjalnego warunku. Można użyćcontinue
,break
instrukcje wewnątrz pętli ją kontrolować lub przenieść warunek zakończenia pętli jakdo ... while
konstruktu.źródło
Nie, polecenie w części warunku może być dowolnym poleceniem (*) . Wszystkie polecenia powłoki mają pewną wartość zwracaną, a
while
pętla (podobnie jakif
warunkowa) przyjmuje wartości zwracane przez zero jako „prawda”, a wszystkie inne jako „fałsz”. (* lub lista kilku poleceń, liczy się ostatnia)Co do tego
:
, instrukcja Bash wyraźnie mówi, jaki jest status zwrotu:help
Wbudowana jest jeszcze bardziej oczywiste:źródło
s/any command/any sequence of commands/
, jak wyjaśnia Stéphane.