Ich habe Probleme, die richtige Kombination aus Semikolons und / oder Klammern zu finden. Ich würde das gerne tun, aber als Einzeiler von der Kommandozeile:
while [ 1 ]
do
foo
sleep 2
done
Ich habe Probleme, die richtige Kombination aus Semikolons und / oder Klammern zu finden. Ich würde das gerne tun, aber als Einzeiler von der Kommandozeile:
while [ 1 ]
do
foo
sleep 2
done
Antworten:
while true; do foo; sleep 2; done
Übrigens, wenn Sie es an der Eingabeaufforderung als mehrzeilig eingeben (wie Sie zeigen) und dann den Verlauf mit dem Pfeil nach oben aufrufen, erhalten Sie ihn in einer einzelnen Zeile, korrekt interpunktiert.
$ while true
> do
> echo "hello"
> sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do echo "hello"; sleep 2; done
cmdhist
Option aktivieren, wenn Sie Bash verwenden?
while true; do sh /Users/myuser/bin/vpn ; done
Es ist auch möglich, den Befehl sleep im Zustand while zu verwenden. Einzeiler imho sauberer aussehen lassen.
while sleep 2; do echo thinking; done
while echo thinking ; do sleep 2 ; done
Natürlich, wenn der Befehl [while] fehlschlägt, wird die Schleife beendet, so dass Sie müssen, while echo thinking || true ; do sleep 2 ; done
aber dann sind Sie zurück zuwhile true ; ...
Doppelpunkt ist immer "wahr":
while :; do foo; sleep 2; done
: [arguments]
Keine Auswirkung; Der Befehl erweitert lediglich die Argumente und führt die angegebenen Umleitungen aus. Ein Null-Exit-Code wird zurückgegeben.
Sie können Semikolons verwenden, um Anweisungen zu trennen:
$ while [ 1 ]; do foo; sleep 2; done
Sie können auch den folgenden until
Befehl verwenden:
until ((0)); do foo; sleep 2; done
Beachten Sie, dass im Gegensatz zu while
, until
die Befehle innerhalb der Schleife ausführen würden, solange die Testbedingung einen Exit-Status hat, der nicht Null ist.
Verwenden einer while
Schleife:
while read i; do foo; sleep 2; done < /dev/urandom
Verwenden einer for
Schleife:
for ((;;)); do foo; sleep 2; done
Ein anderer Weg mit until
:
until [ ]; do foo; sleep 2; done
until ((0)); do foo; sleep 2; done
scheint nicht zu funktionieren. Es ist unendlich.
Ich verwende die Semikolons nur für die WHILE-Anweisung und den && -Operator, damit die Schleife mehr als eine Sache tut ...
Also mache ich es 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
&&
in der Schleife ist die gleiche wie zu jeder anderen Zeit, nicht wahr? Benötigen Sie das zweite, was nur passiert, wenn das erste passiert, dann reicht die Verwendung von &&
else ;
aus. Wirklich, Sie möchten den Inhalt dieser Schleife kurz und einfach halten, idealerweise nur einen Befehl, also eine Funktion oder ein Skript.
Verwenden Sie watch
stattdessen eine einfache Prozessüberwachung
Verwenden von while
:
while true; do echo 'while'; sleep 2s; done
Verwenden der for
Schleife:
for ((;;)); do echo 'forloop'; sleep 2; done
Verwenden von Recursion
(etwas anders als oben, Tastatur-Interrupt wird es nicht stoppen)
list(){ echo 'recursion'; sleep 2; list; } && list;
Wenn Sie möchten, dass die while-Schleife nach einer bestimmten Bedingung stoppt und Ihr foo
Befehl ungleich Null zurückgibt, wenn diese Bedingung erfüllt ist, können Sie die Schleife wie folgt unterbrechen:
while foo; do echo 'sleeping...'; sleep 5; done;
Wenn der foo
Befehl beispielsweise Dinge in Stapeln löscht und 1 zurückgibt, wenn nichts mehr zu löschen ist.
Dies funktioniert gut, wenn Sie ein benutzerdefiniertes Skript haben, das einen Befehl bis zu einer bestimmten Bedingung mehrmals ausführen muss. Sie schreiben das Skript, mit 1
dem beendet werden soll, wenn die Bedingung erfüllt ist, und beenden das Skript, 0
wenn es erneut ausgeführt werden soll.
Angenommen, Sie haben ein Python-Skript, batch_update.py
das 100 Zeilen in einer Datenbank aktualisiert und zurückgibt, 0
wenn mehr zu aktualisieren sind und 1
wenn keine mehr vorhanden sind. Mit dem folgenden Befehl können Sie die Zeilen 100 gleichzeitig aktualisieren, wobei zwischen den Aktualisierungen 5 Sekunden lang geschlafen wird:
while batch_update.py; do echo 'sleeping...'; sleep 5; done;
foo
Befehl mit Code, 1
wenn die while-Schleife unterbrochen werden soll. Ich habe meine Antwort mit einem Beispiel aktualisiert.
Wenn ich zwei praktische Beispiele nennen kann (mit ein bisschen "Emotion").
Dies schreibt den Namen aller Dateien, die mit ".jpg" enden, in den Ordner "img":
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, einen Beitrag zu leisten.
ls -1 *.jpg
undrm *.jpg
Sie können dies auch versuchen. WARNUNG: Dies sollten Sie nicht tun, aber da die Frage nach einer Endlosschleife ohne Ende fragt ... so könnten Sie es tun.
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done