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 boucle bash différentes. Vous apprendrez également à utiliser des boucles pour parcourir les éléments du 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 de structures de boucle que vous pouvez utiliser dans bash. Il existe deux styles différents pour écrire une boucle for.
- Boucles for de style C
- Utilisation de la boucle for sur une liste/plage d'éléments
Les boucles For de style C dans Bash
Si vous connaissez 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 mentionnée ci-dessus, la boucle for suivante affichera "Hello Friend" dix fois :
for ((i = 0 ; i < 10 ; i++)); do
echo "Hello Friend"
done
La boucle for a d'abord initialisé la variable entière i à zéro alors il teste la condition (i <10); si vrai, alors la boucle exécute la ligne echo "Hello Friend" et incrémente la variablei par 1 , puis la boucle s'exécute encore et encore jusqu'à i n'est plus inférieur à 10 .
[email protected]:~$ 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 qui est 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
La var.sh le script ci-dessous affichera tous les fichiers et répertoires qui existent sous /var répertoire :
#!/bin/bash
for i in /var/*; do
echo $i
done
Vous trouverez ci-dessous un exemple de sortie lorsque vous exécutez le script var.sh :
[email protected]:~$ ./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
Boucles While 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 3x10.sh suivant utilise une boucle while qui affichera les dix premiers multiples du nombre trois :
#!/bin/bash
num=1
while [ $num -le 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
Voici la sortie du script ci-dessus :
[email protected]:~$ ./3x10.sh
3
6
9
12
15
18
21
24
27
30
Il a d'abord initialisé le num variable à 1; ensuite, la boucle while s'exécutera aussi longtemps que num est inférieur ou égal à 10 . Dans le corps de la boucle while, la commande echo imprime num multiplié par trois puis il incrémente num par 1 .
Jusqu'à des boucles dans Bash
Si vous venez d'un milieu 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 qui existe dans bash. La boucle until suit la même syntaxe que la boucle while :
until [ condition ]; do
[COMMANDS]
Done
La principale différence entre la boucle until et la boucle while est dans la condition de test. Une boucle while continue de s'exécuter tant que la condition de test est vraie ; d'un autre côté, une boucle jusqu'à continuera de fonctionner tant que la condition de test est fausse !
Par exemple, vous pouvez facilement créer le 3x10.sh script avec une boucle until 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 familiarisé avec les boucles des scripts bash
Imprimer le contenu d'un tableau en bash
Si vous suivez cette série de tutoriels depuis le début, vous devriez être familiarisé avec les tableaux dans bash.
Les boucles for sont souvent le choix le plus populaire lorsqu'il s'agit d'itérer sur des éléments de tableau.
Par exemple, le prime.sh suivant le script 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 la sortie du script prime.sh :
[email protected]:~$ ./prime.sh
2
3
5
7
11
13
17
19
23
29
Utilisation de 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 met fin à 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 un continuer instruction pour ignorer une itération de boucle. La boucle continue et passe à l'itération suivante, mais les commandes après les instructions continuent sont ignorées dans cette itération particulière.
Par exemple, le odd.sh suivant le script 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 la sortie qui imprime les nombres impairs :
[email protected]:~$ ./odd.sh
1
3
5
7
9
Boucles infinies dans bash
Une boucle infinie est une boucle qui tourne 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 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 par 1 . Pour résoudre ce problème, vous devez modifier i++ avec je-- 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 didacticiel de la série Bash Beginner. J'espère que vous avez aimé faire des boucles dans bash !
Pratiquez maintenant la boucle avec quelques exercices simples. Vous obtenez également la solution dans le PDF ci-dessous.
Bash Chapter 8 Practice QuestionsProblems et leur solution pour mettre en pratique ce que vous venez d'apprendre dans ce chapitreBash-Chapter-8-Practice-Questions-Linux-Handbook.pdf28 KB
Jetez un œil au chapitre suivant car vous apprendrez à réutiliser le code dans vos scripts bash en créant des fonctions.