Was bedeutet „while :;“?

Was bedeutet „while :;“?

Ich weiß, was eine whileSchleife 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 whilesein muss .TRUEFALSE

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 TRUEoder 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 cmdimmer wieder und immer wieder, da :immer Erfolg zurückgegeben wird. Das ist diefür immerSchleife. Sie können truestattdessen 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 „ truewas“ nicht integriert war (vor langer Zeit; trueheutzutage 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; doneuntil ! 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...; donebei 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 trueoder falsenicht 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- falseImplementierungen 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 whileSchleife (sowie die ifBedingung) 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 helpeingebaute Feature ist noch deutlicher:

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.

verwandte Informationen