Recherche de site Web

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.

Articles connexes: