GNU/Linux >> Tutoriels Linux >  >> Linux

Bash Beginner Series #8 :Boucles dans Bash

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

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.


Linux
  1. Comment écrire une boucle dans Bash

  2. Script Linux :3 tutoriels pour les boucles while dans Bash

  3. Bash Beginner Series #9 :Utiliser des fonctions dans Bash

  4. RHCE Ansible Series #5 :Ansible Loops

  5. Bash for loop Exemples

Bash Beginner Series #5 :Utilisation des opérateurs arithmétiques dans les scripts Bash

Bash Beginner Series #4 :Utiliser des tableaux dans Bash

Bash Beginner Series #3 :Passer des arguments aux scripts Bash

Bash Beginner Series #7 :Prise de décision avec des instructions If Else et Case Statements

Bash Beginner Series #6 :Opérations sur les chaînes dans Bash

Bash Beginner Series #10 :Automatisation avec Bash