Utilisation des boucles For, While et Until dans Bash [Guide du débutant]
Les boucles sont essentielles pour tout langage de script. Apprenez les boucles for, while et Until avec des exemples dans ce chapitre de la série Bash Beginner.
Attention aux boucles infinies !
La possibilité de boucler est une fonctionnalité très puissante des scripts bash. Les boucles ont une variété de cas d’utilisation.
Dans ce didacticiel, vous explorerez les trois structures de boucles bash différentes. Vous apprendrez également à utiliser des boucles pour parcourir les éléments d’un tableau.
De plus, vous apprendrez à utiliser les instructions break et continue pour contrôler les boucles, et enfin, vous apprendrez à créer des boucles infinies.
Pour les boucles dans Bash
Les boucles For sont l’un des trois types différents de structures de boucles que vous pouvez utiliser dans bash. Il existe deux styles différents pour écrire une boucle for.
Style C pour les boucles
Utiliser la boucle for sur une liste/plage d'éléments
Boucles For de style C dans Bash
Si vous êtes familier avec un langage de programmation de type C ou C++, vous reconnaîtrez la syntaxe de boucle for suivante :
for ((initialize ; condition ; increment)); do
[COMMANDS]
done
En utilisant la syntaxe de style C susmentionnée, la boucle for suivante affichera « Hello Friend » dix fois :
for ((i = 0 ; i < 10 ; i++)); do
echo "Hello Friend"
done
La boucle for initialise d'abord la variable entière i à zéro puis elle teste la condition (i <10) ; si c'est vrai, alors la boucle exécute la ligne echo « Hello Friend » et incrémente la variable i de 1, puis la boucle s'exécute à nouveau et encore une fois jusqu'à ce que i ne soit plus inférieur à 10.
kabary@handbook:~$ bash hello.sh
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Liste/plage pour les boucles dans Bash
Il existe également une autre variante de syntaxe de la boucle for, particulièrement utile si vous travaillez avec une liste de fichiers (ou de chaînes), une plage de nombres, des tableaux, la sortie d'une commande, etc. La syntaxe liste/plage pour la boucle prend la forme suivante :
for item in [LIST]; do
[COMMANDS]
done
Par exemple, la boucle for suivante fait exactement la même chose que la boucle for de style C que vous avez créée dans la section précédente :
for i in {1..10}; do
echo "Hello Friend"
done
Le script var.sh ci-dessous affichera tous les fichiers et répertoires qui existent sous le répertoire /var :
#!/bin/bash
for i in /var/*; do
echo $i
done
Vous trouverez ci-dessous un exemple de résultat lorsque vous exécutez le script var.sh :
kabary@handbook:~$ ./var.sh
/var/backups
/var/cache
/var/crash
/var/lib
/var/local
/var/lock
/var/log
/var/mail
/var/metrics
/var/opt
/var/run
/var/snap
/var/spool
/var/tmp
Tandis que les boucles dans Bash
La boucle while est une autre boucle populaire et intuitive que vous pouvez utiliser dans les scripts bash. La syntaxe générale d'une boucle while est la suivante :
while [ condition ]; do
[COMMANDS]
done
Par exemple, le script 3x10.sh suivant utilise une boucle while qui imprimera les dix premiers multiples du nombre trois :
#!/bin/bash
num=1
while [ $num -le 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
Voici le résultat du script ci-dessus :
kabary@handbook:~$ ./3x10.sh
3
6
9
12
15
18
21
24
27
30
Il a d'abord initialisé la variable num à 1 ; ensuite, la boucle while s'exécutera tant que num est inférieur ou égal à 10. Dans le corps de la boucle while, la commande echo imprime num multiplié par trois , puis elle incrémente num de 1 .
Jusqu'à ce que les boucles soient dans Bash
Si vous venez d'un environnement C/C++, vous recherchez peut-être une boucle do-while mais celle-ci n'existe pas dans bash.
Il existe un autre type de boucle dans bash. La boucle jusqu'à suit la même syntaxe que la boucle while :
until [ condition ]; do
[COMMANDS]
Done
La principale différence entre la boucle jusqu'à et la boucle while réside dans la condition de test. Une boucle while continuera à s'exécuter tant que la condition de test est vraie ; d'un autre côté, une boucle jusqu'à ce que continuera à fonctionner tant que la condition de test est fausse !
Par exemple, vous pouvez facilement créer le script 3x10.sh avec une boucle jusqu'à au lieu d'une boucle while ; l'astuce ici est d'annuler la condition de test :
#!/bin/bash
num=1
until [ $num -gt 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
Notez que la négation de la condition de test [ $num -le 10 ]; est [ $num -gt 10 ] ;
En savoir plus sur les boucles dans les scripts bash
Maintenant que vous êtes familier avec les boucles des scripts bash
Imprimer le contenu d'un tableau en bash
Si vous suivez cette série de didacticiels depuis le début, vous devriez être familier avec les tableaux en bash.
Les boucles For sont souvent le choix le plus populaire lorsqu'il s'agit d'itérer sur des éléments d'un tableau.
Par exemple, le script prime.sh suivant parcourt et imprime chaque élément du tableau principal :
#!/bin/bash
prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
echo $i
done
Voici le résultat du script prime.sh :
kabary@handbook:~$ ./prime.sh
2
3
5
7
11
13
17
19
23
29
Utiliser Break et Continue dans les boucles bash
Parfois, vous souhaiterez peut-être quitter une boucle prématurément ou ignorer une itération de boucle. Pour ce faire, vous pouvez utiliser les instructions break et continue.
L'instruction break termine l'exécution d'une boucle et fait passer le contrôle du programme à la commande ou à l'instruction suivante suivant la boucle.
Par exemple, la boucle suivante n’imprimerait que les nombres de un à trois :
for ((i=1;i<=10;i++)); do
echo $i
if [ $i -eq 3 ]; then
break
fi
done
Vous pouvez également utiliser une instruction continue pour ignorer une itération de boucle. La boucle continue et passe à l'itération suivante, mais les commandes après les instructions continue sont ignorées dans cette itération particulière.
Par exemple, le script odd.sh suivant n'imprimerait que les nombres impairs de un à dix car il ignore tous les nombres pairs :
#!/bin/bash
for ((i=0;i<=10;i++)); do
if [ $(($i % 2)) -ne 1 ]; then
continue
fi
echo $i
done
Voici le résultat qui affiche les nombres impairs :
kabary@handbook:~$ ./odd.sh
1
3
5
7
9
Boucles infinies en bash
Une boucle infinie est une boucle qui continue de fonctionner indéfiniment ; cela se produit lorsque la condition de test de boucle est toujours vraie.
Dans la plupart des cas, les boucles infinies sont le produit d’une erreur logique humaine.
Par exemple, quelqu'un qui souhaite créer une boucle qui imprime les nombres de 1 à 10 dans l'ordre décroissant peut finir par créer par erreur la boucle infinie suivante :
for ((i=10;i>0;i++)); do
echo $i
done
Le problème est que la boucle continue d'incrémenter la variable i de 1. Pour résoudre ce problème, vous devez remplacer i++ par i-- comme suit :
for ((i=10;i>0;i--)); do
echo $i
done
Dans certains cas, vous souhaiterez peut-être créer intentionnellement des boucles infinies pour attendre qu'une condition externe soit remplie sur le système. Vous pouvez facilement créer une boucle for infinie comme suit :
for ((;;)); do
[COMMANDS]
done
Si vous souhaitez plutôt créer une boucle while infinie, vous pouvez la créer comme suit :
while [ true ]; do
[COMMANDS]
done
Génial! Cela nous amène à la fin de ce tutoriel de la série Bash Beginner. J'espère que vous avez aimé faire des boucles dans bash !
Pratiquez maintenant le bouclage avec quelques exercices simples. Vous obtenez également la solution dans le PDF ci-dessous.
Jetez un œil au chapitre suivant pour apprendre à réutiliser le code dans vos scripts bash en créant des fonctions.