Script Bash : comment utiliser les boucles While ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons apprendre à utiliser les boucles While en Bash, ce qui vous permettra de les utiliser dans vos scripts Bash ! Une boucle While permet d'exécuter des instructions, c'est-à-dire des commandes, tant qu'une condition donnée est vraie.
Nous allons évoquer la syntaxe de base ainsi que plusieurs exemples pour que vous puissiez mettre en pratique les boucles While dans vos scripts Bash.
Pour rappel, voici le lien vers notre introduction au Bash :
II. Bash : la syntaxe de la boucle While
La boucle While en Bash suit une syntaxe relativement simple. Elle commence par le mot-clé "while" suivi d'une condition définie entre crochets. Donc, tant que cette condition est vraie, les commandes à l'intérieur de la boucle seront exécutées (c'est-à-dire les commandes après le mot-clé "do").
Voici la syntaxe d'une boucle While :
while [ condition ]
do
# Les commandes à exécuter tant que la condition évaluée est vraie
done
Voyons un exemple simple pour mieux comprendre le fonctionnement d'une boucle While en Bash. Supposons que nous voulions tout simplement afficher les nombres de 1 à 5. Nous définissons une valeur de départ grâce à la variable "Nombre" et nous allons l'incrémenter à chaque tour de boucle (itération). Dans cet exemple, la condition "[ $Nombre -le 5 ]" vérifie si la variable "Nombre" est inférieure ou égale à 5.
Tant que cette condition est vraie, la boucle continue d'exécuter les commandes à l'intérieur. Ici, nous affichons dans la console la valeur actuelle de la variable "Nombre" et nous incrémentons de "+1" cette variable (sinon la boucle sera infinie).
Voici le code à inclure dans un script Bash :
!/bin/bash
Nombre=1
while [ $Nombre -le 5 ]
do
echo "Nombre : $Nombre"
((Nombre++))
done
Nous obtenons le résultat suivant :
Dès que la variable "Nombre" est égale à "6", le traitement de la boucle s'arrête puisque notre condition vérifie si la variable "Nombre" est inférieure ou égale à 5.
III. Boucle While avec plusieurs conditions
Nous venons de voir comment inclure une seule condition dans une boucle While. Sachez que nous pouvons utiliser plusieurs conditions grâce aux opérateurs logiques comme "&&" (ET) et "||" (OU).
En s'inspirant de l'exemple précédent, voici un nouvel exemple basé sur deux variables "Nombre1" et "Nombre2" couplées à l'opérateur logique "&&" (ET). Ainsi, nous avons bien deux conditions et les deux doivent être vraies pour que le code de la boucle soit exécuté (le comportement serait différent avec l'opérateur logique "OU").
!/bin/bash
Nombre1=1
Nombre2=1
while [ $Nombre1 -le 10 ] && [ $Nombre2 -le 5 ]
do
echo "Nombre1 : $Nombre1 - Nombre2 : $Nombre2"
((Nombre1++))
((Nombre2++))
done
Donc, comme le montre l'image ci-dessous, la boucle s'exécute tant que les deux conditions sont vraies.
IV. Boucle While : vérifier la saisie d'un utilisateur
La boucle While en Bash peut être utile lorsque le script attend qu'un utilisateur saisisse une valeur (via la commande read). En effet, ce sera très pratique pour s'assurer que l'utilisateur a bien saisi une valeur : si ce n'est pas le cas, nous pouvons lui demander de saisir de nouveau une valeur. Grâce à la boucle While, nous allons pouvoir lui demander tant que la valeur est vide.
Dans l'exemple suivant, nous vérifions si l'utilisateur a bien saisi quelque chose avant de continuer. Tant que la valeur est vide, nous redemandons à l'utilisateur de saisir une valeur. Nous effectuons ce contrôle avec l'opérateur "-z" couplé ici avec une boucle While.
#!/bin/bash
while [ -z $username ]
do
echo "Veuillez saisir votre identifiant :"
read username
done
echo "Identifiant sélectionné : $username"
L'image ci-dessous, montre bien que nous obtenons le résultat attendu.
V. Boucle While : lire le contenu d'un fichier
Les boucles While peuvent également être utilisées pour lire des fichiers ligne par ligne. Cela peut être extrêmement utile pour traiter des fichiers de grande taille ou pour effectuer des opérations spécifiques sur chaque ligne d'un fichier.
1.1.1.1
2.2.2.2
3.3.3.3
4.4.4.4
Imaginons que nous ayons un fichier noms.txt
contenant une liste de noms, et que nous souhaitions les afficher un par un. Voici comment procéder avec une boucle While :
#!/bin/bash
# Lire le fichier ligne par ligne avec la boucle While
while IFS= read -r ip
do
# Bannir l'adresse IP dans CrowdSec (ajout décision)
echo "cscli decisions add --ip $ip"
cscli decisions add --ip "$ip"
done < "/home/flo/ip.txt"
Quelques explications :
- La variable "IFS" (Internal Field Separator) sert à indiquer à Bash comment sont séparées les valeurs dans le fichier source. Ici, il n'y a pas de séparateur spécifique, car il y a une valeur par ligne. Si les valeurs seraient séparées par un "#", il conviendrait de préciser : "IFS='#'".
- L'instruction "read -r ip" sert à parcourir le fichier en associant chaque valeur à la variable "ip". L'option "-r" permet de ne pas interpréter le caractères d'échappement (le "backslashe", c'est-à-dire "\"), ainsi, nous allons interpréter le contenu du fichier comme du texte (littéralement parlant).
- L'instruction "done < "/home/flo/ip.txt"" à la fin de la boucle While redirige l'entrée standard de la boucle pour qu'elle lise les lignes du fichier "/home/flo/ip.txt". Autrement dit, pour chaque itération de la boucle, une ligne du fichier "ip.txt" sera lue, jusqu'à ce que toutes les lignes aient été lues.
- La commande "cscli decisions add" est spécifique à l'outil CrowdSec. Il s'agit de la commande à utiliser pour bannir manuellement une adresse IP.
VI. Conclusion
Voilà, nous venons d'étudier le fonctionnement des boucles While en Bash ! Désormais, vous n'avez plus qu'à en profiter dans vos scripts Bash ! Si vous avez une question, vous pouvez poster un commentaire sur cet article.
Pour approfondir le sujet, vous pouvez consulter nos tutoriels Bash en utilisant le lien ci-dessous :
D'autres tutoriels sur Bash seront publiés par la suite sur IT-Connect !