Es gibt die bekannte while condition; do ...; done
Schleife, aber gibt es eine do... while
Stilschleife, die mindestens eine Ausführung des Blocks garantiert?
Es gibt die bekannte while condition; do ...; done
Schleife, aber gibt es eine do... while
Stilschleife, die mindestens eine Ausführung des Blocks garantiert?
Antworten:
Eine sehr vielseitige Version von a do ... while
hat 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 i
der Fall ist (für den kein Wert festgelegt wurde ), wird die Schleife 20 Mal ausgeführt.
UN-Kommentiert die Zeile, die i
auf 16 gesetzt ist i=16
, wird die Schleife viermal ausgeführt.
Für i=16
, i=17
, i=18
und 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
set -e
irgendetwas 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 &&
!
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