Ich weiß, was eine while
Schleife ist. Ich habe jedoch nur gesehen, dass sie bei Folgendem funktioniert:
while [condition]
while ![condition]
while TRUE (infinite loop)
Wobei die Anweisung danach entweder oder while
sein muss .TRUE
FALSE
Es gibt einen in der Shell integrierten Befehl namens :
. Er wird als Dummy-Befehl beschrieben, der nichts tut, aber ich weiß nicht, ob es hier dasselbe ist, auch wenn es TRUE
oder sein kann FALSE
. Vielleicht ist es etwas anderes, aber was?
Antwort1
Die Syntax lautet:
while
first list of commands
do
second list of commands
done
Dadurch wird die zweite Befehlsliste in einer Schleife ausgeführt, solange die erste Befehlsliste (also die letzte Ausführung in dieser Liste) erfolgreich ist.
Darinerste Liste der Befehle, Sie können den [
Befehl verwenden, um verschiedene Arten von Tests durchzuführen, oder Sie können den :
Nullbefehl verwenden, der nichts tut und Erfolg zurückgibt, oder einen beliebigen anderen Befehl.
while :; do cmd; done
Läuft cmd
immer wieder und immer wieder, da :
immer Erfolg zurückgegeben wird. Das ist diefür immerSchleife. Sie können true
stattdessen den Befehl verwenden, um es lesbarer zu machen:
while true; do cmd; done
Früher war es den Leuten lieber, :
dass „as“ :
immer integriert war, während „ true
was“ nicht integriert war (vor langer Zeit; true
heutzutage haben die meisten Shells eine integrierte Version)¹.
Andere Varianten, die Sie möglicherweise sehen:
while [ 1 ]; do cmd; done
Oben rufen wir den [
Befehl auf, um zu testen, ob die Zeichenfolge „1“ nicht leer ist (also auch immer wahr ist).
while ((1)); do cmd; done
Verwenden der Korn-/Bash-/Zsh -Syntax, um die von C ((...))
nachzuahmen .while(1) { ...; }
Oder kompliziertere wie until false; do cmd; done
…until ! true
Diese werden manchmal wie folgt als Alias bezeichnet:
alias forever='while :; do'
Sie können also beispielsweise Folgendes tun:
forever cmd; done
Nur wenige Menschen sind sich darüber im Klaren, dass es sich bei dieser Erkrankung um eineListevon Befehlen. Beispielsweise schreibt man:
while :; do
cmd1
cmd2 || break
cmd3
done
Dabei hätten sie schreiben können:
while
cmd1
cmd2
do
cmd3
done
Es macht Sinn, dass es einListeda Sie häufig solche Dinge tun möchten, while cmd1 && cmd2; do...; done
bei denen es sich ebenfalls um Befehlslisten handelt.
Beachten Sie in jedem Fall, dass es [
sich um einen Befehl wie jeden anderen handelt (obwohl er in modernen Bourne-ähnlichen Shells integriert ist). Er muss nicht ausschließlich in den if
/ while
/ until
-Bedingungslisten verwendet werden, und diese Bedingungslisten müssen diesen Befehl nicht häufiger verwenden als andere Befehle.
¹ :
ist auch kürzer und akzeptiert Argumente (die es ignoriert). Während das Verhalten von true
oder false
nicht angegeben ist, wenn Sie ihm ein beliebiges Argument übergeben. So kann man zum Beispiel Folgendes tun:
while : you wait; do
something
done
Aber das Verhalten von:
until false is true; do
something
done
ist nicht angegeben (würde aber in den meisten Shell- false
Implementierungen funktionieren).
Antwort2
while :
ist eine Endlosschleife. :
Tut einfach nichts (erfolgreich).
Wenn Sie also möchten, dass Ihre Shell für immer hängen bleibt und nichts tut, können Sie sie wie folgt schreiben:
while :
do
:
done
Oder in einer einzelnen Zeile mit ;
anstelle von Zeilenumbrüchen:while :; do :; done
while :
wird normalerweise verwendet, wenn Sie etwas wiederholt tun möchten, ohne dass eine spezielle Bedingung verknüpft ist. Sie können continue
, break
-Anweisungen innerhalb der Schleife verwenden, um sie zu steuern oder die Bedingung wie ein Konstrukt an das Ende der Schleife zu verschieben do ... while
.
Antwort3
Wie dem auch sei, die Aussage nach „while“ muss entweder WAHR oder FALSCH sein.
Nein, der Befehl im Bedingungsteil kann ein beliebiger Befehl (*) sein .AlleShell-Befehle haben einen Rückgabewert, und die while
Schleife (sowie die if
Bedingung) akzeptieren Rückgabewerte von Null als „wahr“ und alle anderen als „falsch“. (* oder eine Liste mehrerer Befehle, der letzte zählt)
Wie für :
,Bashs Handbuchsagt deutlich, was der Rückgabestatus davon ist:
: [arguments]
Tun Sie nichts, außer Argumente zu erweitern und Umleitungen durchzuführen. Der Rückgabestatus ist Null.
Das help
eingebaute Feature ist noch deutlicher:
$ help :
[...]
No effect; the command does nothing
Exit Status:
Always succeeds.