mache ... solange oder mache ... bis im POSIX-Shell-Skript

16

Es gibt die bekannte while condition; do ...; doneSchleife, aber gibt es eine do... whileStilschleife, die mindestens eine Ausführung des Blocks garantiert?

Shawn J. Goff
quelle
Vielen Dank Shawn, ich hatte nicht erwartet, dass die Antwort so schnell zur ausgewählten Antwort wird. Also: Danke für die Auswahl.

Antworten:

15

Eine sehr vielseitige Version von a do ... whilehat diese Struktur:

while 
      Commands ...
do :; done

Ein Beispiel ist:

#i=16
while
      echo "this command is executed at least once $i"
      : ${start=$i}              # capture the starting value of i
      # some other commands      # needed for the loop
      (( ++i < 20 ))             # Place the loop ending test here.
do :; done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

Da dies ider Fall ist (für den kein Wert festgelegt wurde ), wird die Schleife 20 Mal ausgeführt.
UN-Kommentiert die Zeile, die iauf 16 gesetzt ist i=16, wird die Schleife viermal ausgeführt.
Für i=16, i=17, i=18und i=19.

Wenn i zum selben Zeitpunkt (dem Start) auf (sagen wir 26) gesetzt ist, werden die Befehle immer noch beim ersten Mal ausgeführt (bis der Befehl zum Unterbrechen der Schleife getestet wird).

Der Test für eine Weile sollte wahr sein (Ausgangsstatus 0).
Der Test sollte für eine Till-Schleife umgekehrt werden, dh: falsch sein (Ausgangsstatus nicht 0).

In einer POSIX-Version müssen mehrere Elemente geändert werden, um zu funktionieren:

i=16
while
       echo "this command is executed at least once $i"
       : ${start=$i}              # capture the starting value of i
       # some other commands      # needed for the loop
       i="$((i+1))"               # increment the variable of the loop.
       [ "$i" -lt 20 ]            # test the limit of the loop.
do :;  done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

./script.sh
this command is executed at least once 16
this command is executed at least once 17
this command is executed at least once 18
this command is executed at least once 19
Final value of 20///16
The loop was executed 4 times 

quelle
Denken Sie daran, dass, wenn Sie set -eirgendetwas verwenden , das innerhalb des while-Bedingungsblocks nicht funktioniert, die Ausführung nicht unterbrochen wird: zB set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done-> shit happens. Also, wenn Sie dies verwenden, müssen Sie sehr vorsichtig mit der Fehlerbehandlung sein, dh verketten Sie alle Befehle mit &&!
Timo
17

Es gibt keine do ... while- oder do ... until-Schleife, aber das Gleiche kann wie folgt erreicht werden:

while true; do
  ...
  condition || break
done

für bis:

until false; do
  ...
  condition && break
done
Shawn J. Goff
quelle
Sie können eine der Trennlinien mit einer der Schleifen verwenden - wahr oder falsch bedeutet nur "für immer". Ich verstehe, dass es ein bisschen die Zeit oder die Beständigkeit bewahrt, die Bedingung eines glücklichen oder traurigen Ausstiegs zu haben.
android.weasel