Esiste il noto while condition; do ...; done
loop, ma esiste un do... while
loop di stile che garantisce almeno un'esecuzione del blocco?
Esiste il noto while condition; do ...; done
loop, ma esiste un do... while
loop di stile che garantisce almeno un'esecuzione del blocco?
Risposte:
Una versione molto versatile di a do ... while
ha questa struttura:
while
Commands ...
do :; done
Un esempio è:
#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 "
Così com'è (nessun valore impostato per i
) il loop viene eseguito 20 volte.
Commentando la linea ON che imposta i
a 16 i=16
, il loop viene eseguito 4 volte.
Per i=16
, i=17
, i=18
e i=19
.
Se i è impostato su (diciamo 26) nello stesso punto (l'inizio), i comandi vengono comunque eseguiti la prima volta (fino a quando non viene testato il comando di interruzione loop).
Il test per un po 'dovrebbe essere veritiero (stato di uscita pari a 0).
Il test deve essere invertito per un ciclo until, ovvero: essere falsy (stato di uscita non 0).
Una versione POSIX necessita di diversi elementi modificati per funzionare:
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
qualcosa che non funziona all'interno del blocco condizione while non interromperà l'esecuzione: ad es. set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done
-> merda accade. Quindi, se usi questo, devi stare molto attento con la gestione degli errori, cioè concatenare tutti i comandi &&
!
Non c'è un do ... while o do ... fino al loop, ma la stessa cosa può essere realizzata in questo modo:
while true; do
...
condition || break
done
per fino a quando:
until false; do
...
condition && break
done