Was ist der beste Weg, um eine Do-While-Schleife in Bash zu emulieren?
Ich könnte vor dem Eintritt in die while
Schleife nach der Bedingung suchen und dann die Bedingung in der Schleife erneut überprüfen, aber das ist doppelter Code. Gibt es einen saubereren Weg?
Pseudocode meines Skripts:
while [ current_time <= $cutoff ]; do
check_if_file_present
#do other stuff
done
Dies funktioniert nicht, check_if_file_present
wenn es nach der $cutoff
Zeit gestartet wird, und eine Pause würde dies tun.
until
Schalter?until
wird auch die Bedingung bewerten, bevor der Körper der Schleife ausgeführt wirdAntworten:
Zwei einfache Lösungen:
Führen Sie Ihren Code einmal vor der while-Schleife aus
Oder:
quelle
:
ist ein eingebautes, entspricht dem eingebautentrue
. Beide "machen nichts erfolgreich".true
ist ein aktuelles Programm, während:
es eingebaut ist. Ersteres verlässt einfach mit0
(undfalse
mit1
) Letzterem tut absolut nichts. Sie können mit überprüfenwhich true
.:
ist weiterhin anstelle vontrue
in Bash verwendbar . Probieren Sie es mitwhile :; do echo 1; done
.true
ist kein eingebauter Bash. Es ist ein Programm, das normalerweise in zu finden ist/bin
.type true
in bash (bis zurück zu bash 3.2) kehrt zurücktrue is a shell builtin
. Es ist wahr, dass dies/bin/true
ein Programm ist; Was an wahr nicht wahr ist,true
ist, dass es nicht eingebaut ist. (tl; dr: true ist eine eingebaute Bash UND ein Programm)Platzieren Sie den Körper Ihrer Schleife nach dem
while
und vor dem Test. Der eigentliche Körper derwhile
Schleife sollte ein No-Op sein.Anstelle des Doppelpunkts können Sie verwenden,
continue
wenn Sie dies besser lesbar finden. Sie können auch einen Befehl einfügen, der nur zwischen Iterationen ausgeführt wird (nicht vor dem ersten oder nach dem letzten), zecho "Retrying in five seconds"; sleep 5
. Oder drucken Sie Trennzeichen zwischen Werten:Ich habe den Test so geändert, dass doppelte Klammern verwendet werden, da Sie scheinbar ganze Zahlen vergleichen. In doppelten eckigen Klammern sind Vergleichsoperatoren wie z. B.
<=
lexikalisch und liefern beispielsweise beim Vergleich von 2 und 10 das falsche Ergebnis. Diese Operatoren arbeiten nicht in eckigen Klammern.quelle
while { check_if_file_present; ((current_time<=cutoff)); }; do :; done
? Dh sind die Befehle innerhalb derwhile
Bedingung effektiv durch Semikolons getrennt, nicht durch zB&&
, und gruppiert durch{}
?&&
oder||
weil dies sie effektiv zu einem Teil des Tests macht, der das kontrolliertwhile
. Wenn Sie dieses Konstrukt nicht in der Befehlszeile verwenden, würde ich es nicht als Einzeiler (speziell in einem Skript) ausführen, da die Absicht nicht lesbar ist.while false; false; false; true; do echo here; break; done
Ausgänge "hier"Wir können eine Do-While-Schleife in Bash folgendermaßen emulieren
while [[condition]]; do true; done
:Zum Beispiel. Hier ist meine Implementierung zum Herstellen einer SSH-Verbindung im Bash-Skript:
Die Ausgabe erfolgt nacheinander wie folgt:
quelle