faire ... tout ou faire ... jusqu'à ce que dans le script shell POSIX

16

Il y a la while condition; do ...; doneboucle bien connue , mais y a-t-il une do... whileboucle de style qui garantit au moins une exécution du bloc?

Shawn J. Goff
la source
Merci beaucoup Shawn, je ne m'attendais pas à ce que la réponse devienne la réponse sélectionnée si rapidement. Donc: merci pour la sélection.

Réponses:

15

Une version très polyvalente d'un do ... whilea 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 i16 i=16, la boucle est exécutée 4 fois.
Pour i=16, i=17, i=18et 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 

la source
Gardez à l'esprit que si vous utilisez set -equelque 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 &&!
Timo
17

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
Shawn J. Goff
la source
Vous pouvez utiliser l'une des lignes de rupture avec l'une ou l'autre des boucles - tandis que true ou until false signifie simplement 'forever'. Je comprends que cela préserve un peu le temps ou le temps d'avoir la condition happy-exit ou sad-exit.
android.weasel