2009-08-17 12 views
449

Ich habe Probleme mit der richtigen Kombination aus Semikola und/oder Klammern. Ich möchte, dies zu tun, sondern als Einzeiler von der Kommandozeile:Syntax für eine einfache Zeile Bash unendlich While-Schleife

while [ 1 ] 
do 
    foo 
    sleep 2 
done 
+4

ersetzen Zeilenumbrüche durch Semikolons. Das Gleiche funktioniert für for-Schleifen. – Tom

+19

@Tom: das funktioniert nicht immer. nach dem tun, müssen Sie den ersten Befehl haben, nicht ein Semikolon –

Antwort

835
while true; do foo; sleep 2; done 

By the way, wenn Sie geben es als eine mehrzeilige (wie Sie zeigen) an der Eingabeaufforderung und dann rufen Sie die Geschichte mit Pfeil auf, Sie erhalten es in einer einzigen Zeile, richtig interpunktiert.

$ while true 
> do 
> echo "hello" 
> sleep 2 
> done 
hello 
hello 
hello 
^C 
$ <arrow up> while true; do echo "hello"; sleep 2; done 
+230

+1 für Meter und Reim. Es ist eine großartige mnemonic: "während * wahr * tun * foo * schlafen * auch * la di da": D – Shabbyrobe

+1

"wenn Sie es als eine mehrzeilige (wie Sie zeigen) an der Eingabeaufforderung eingeben und dann den Verlauf mit Pfeil aufrufen oben, werden Sie es in einer einzigen Zeile, richtig interpunktiert bekommen. " war nicht wahr für mich. –

+0

@VincentScheib, überprüfen Sie 'cmdhist' Option, wenn Sie Bash verwenden? –

23

Sie können Semikolons getrennte Anweisungen verwenden:

$ while [ 1 ]; do foo; sleep 2; done 
+0

Ich mag diese Antwort, weil sie erklärt wann und warum; (Semikolon) ist erforderlich. –

6

Ich mag die Semikolons für die While nur verwenden, und der & & Operator die Schleife zu tun mehr als eine Sache zu machen. ..

So tut es mir immer so

while true ; do echo Launching Spaceship into orbit && sleep 5s && /usr/bin/launch-mechanism && echo Launching in T-5 && sleep 1s && echo T-4 && sleep 1s && echo T-3 && sleep 1s && echo T-2 && sleep 1s && echo T-1 && sleep 1s && echo liftoff ; done 
+1

Nun, die Verwendung von '&&' in der Schleife ist die gleiche wie jede andere Zeit wirklich nicht wahr ist. Brauchen Sie die zweite Sache nur, wenn die erste passiert, dann verwenden Sie '&&' else ';' sufficies. Wirklich, Sie wollen den Inhalt dieser Schleife kurz und einfach halten, idealerweise nur einen Befehl, also eine Funktion oder ein Skript. – thecoshman

1

Wenn ich zwei praktische Beispiele geben kann (mit ein bisschen "Emotion").

Dies schreibt die Namen aller Dateien mit ".jpg" in den Ordner "img" beendet:

for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done 

Dies löscht sie:

for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done 

Ich versuche nur, beizutragen.

+3

Es ist einfacher zu sagen: '' 'für f in * .jpg; tue echo $ f; done''' – JKnight

+1

@JKnight - für diese Beispiele würdest du nicht einfach ** 'ls -1 * .jpg' ** und **' rm * .jpg' ** –

+2

Beides sind keine Endlosschleifen und nicht solange Schleifen. – Marian

126

Es ist auch möglich, im while-Zustand den Schlafbefehl zu verwenden. Making One-Liner sieht sauberer imho.

while sleep 2; do echo thinking; done 
+1

gut zu wissen !! –

+5

Gut, das macht mehr als nur die Syntax zu ändern - es wird den Befehl * nach * dem Schlaf ausführen. In der vorherigen Antwort wird der Befehl sofort ausgeführt.Nur etwas zu beachten. – DanGordon

55

Colon ist immer "true":

while :; do foo; sleep 2; done 
+11

Warum ist Doppelpunkt immer wahr? – Michelle

+5

@Pineapple Under the Sea: Von der bash man-Seite: (im Abschnitt SHELL BUILTIN BEFEHLE) ': [Argumente]' Keine Wirkung; Der Befehl führt nichts über das Erweitern von Argumenten und das Ausführen bestimmter Umleitungen aus. Ein Null-Exit-Code wird zurückgegeben. –

+2

Diese Syntax wird empfohlen als: ist Teil der Shell selbst, d. H.: Ist ein Shell-Befehl builtin. – avner

18

Sie auch die Verwendung von until Befehl machen:

dass
until ((0)); do foo; sleep 2; done 

Hinweis im Gegensatz zu while, until die Befehle innerhalb ausführen würde die Schleife solange die Testbedingung einen Exit-Status hat, der nicht Null ist.


Verwenden eines while loop:

while read i; do foo; sleep 2; done < /dev/urandom 

Verwenden eines for loop:

for ((;;)); do foo; sleep 2; done 

Ein anderer Weg until Verwendung:

until [ ]; do foo; sleep 2; done 
+4

+1 für eine alternative Lösung. – glen3b

5

Eine sehr einfache Endlosschleife ..:)

while true ; do continue ; done 

Fr Ihre Frage wäre es:

while true; do foo ; sleep 2 ; done 
2

Für einfache Verfahren Gebrauch beobachten watch statt

0

Sie diese zu WARNUNG versuchen können: dies nicht, da das tun sollten, aber Frage fragt nach Endlosschleife ohne Ende ... so könnte man es machen.

while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done 
+0

Warum würdest du das überhaupt tun? –

+1

weil Brian Deacon, der die Frage gestellt hat, wie eine unendliche Schleife wollte. Es ist mehr als eine Möglichkeit, eine Katze zu häuten, die alle –

1

Wenn Sie wollen, dass die while-Schleife nach einem gewissen Zustand zu stoppen, und Ihr foo Befehl gibt Nicht-Null, wenn diese Bedingung erfüllt ist, dann können Sie die Schleife bekommen wie diese zu brechen:

while foo; do echo 'sleeping...'; sleep 5; done; 

Zum Beispiel, wenn der Befehl foo Dinge in Stapeln löscht, und es gibt 1 zurück, wenn nichts mehr zu löschen ist.

Dies funktioniert gut, wenn Sie ein benutzerdefiniertes Skript haben, das einen Befehl viele Male bis zu einer Bedingung ausführen muss. Sie schreiben das Skript zum Beenden mit 1, wenn die Bedingung erfüllt ist, und beenden Sie mit 0, wenn es erneut ausgeführt werden soll.

Zum Beispiel, sagen Sie einen Python-Skript batch_update.py haben, die 100 Zeilen in einer Datenbank aktualisiert und gibt 0, wenn es mehr zu aktualisieren und 1 ist, wenn es nicht mehr ist. Der folgende Befehl ermöglicht es Ihnen, Zeilen 100 zu einem Zeitpunkt zu aktualisieren mit 5 Sekunden zwischen den Updates schlafen:

while batch_update.py; do echo 'sleeping...'; sleep 5; done; 
+0

ist und wie würden Sie gehen? –

+0

Sie machen den Befehl 'foo' mit dem Code' 1' beenden, wenn die While-Schleife unterbrochen werden soll. Ich habe meine Antwort mit einem Beispiel aktualisiert. –