Il y a la while condition; do ...; done
boucle bien connue , mais y a-t-il une do... while
boucle de style qui garantit au moins une exécution du bloc?
Il y a la while condition; do ...; done
boucle bien connue , mais y a-t-il une do... while
boucle de style qui garantit au moins une exécution du bloc?
Réponses:
Une version très polyvalente d'un do ... while
a cette structure:
while
Commands ...
do :; done
Un exemple est:
#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 "
En l'état (aucune valeur définie pour i
), la boucle s'exécute 20 fois.
UN-Commentant la ligne qui prend la valeur i
16 i=16
, la boucle est exécutée 4 fois.
Pour i=16
, i=17
, i=18
et i=19
.
Si i est défini sur (disons 26) au même point (le début), les commandes sont toujours exécutées la première fois (jusqu'à ce que la commande de rupture de boucle soit testée).
Le test pendant un certain temps doit être véridique (état de sortie de 0).
Le test doit être inversé pour une boucle jusqu'à, c'est-à-dire: être faux (état de sortie non 0).
Une version POSIX a besoin de plusieurs éléments modifiés pour fonctionner:
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
quelque chose qui échoue dans le bloc de conditions while ne va pas arrêter l'exécution: par exemple set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done
-> shit se produit. Donc, si vous utilisez cela, vous devez être très prudent avec la gestion des erreurs, c'est-à-dire enchaîner toutes les commandes avec &&
!
Il n'y a pas de boucle do ... while ou do ... until, mais la même chose peut être accomplie comme ceci:
while true; do
...
condition || break
done
jusqu'à:
until false; do
...
condition && break
done