Les boucles While constituent une structure fondamentale dans la programmation shell, permettant d’exécuter des blocs de commandes de façon répétée tant qu’une condition demeure vraie. Comprendre leur fonctionnement et maîtriser leur syntaxe ouvre des portes vers l’automatisation robuste de tâches complexes sous Linux, du traitement de fichiers volumineux à la validation des saisies utilisateur.

Comprendre la structure et la syntaxe d’une boucle While en Bash
Une boucle While en Bash s’articule autour d’une condition évaluée à chaque itération. Le code englobé dans la boucle s’exécute tant que cette condition retourne une valeur vraie ; dès qu’elle devient fausse, le programme poursuit son exécution en dehors de la boucle. Cette mécanique offre une flexibilité considérable pour les scripts Bash qui nécessitent une répétition d’actions jusqu’à atteindre un état spécifique.
La syntaxe de base suit ce modèle :
while [ condition ]
do
# Commandes à exécuter
done
Le mot-clé while déclenche l’évaluation de la condition placée entre crochets. Les commandes situées entre do et done forment le corps de la boucle. À chaque passage, Bash teste la condition : si elle est vraie, les commandes s’exécutent ; si elle est fausse, la boucle se termine immédiatement.
Considérons un exemple concret pour illustrer ce mécanisme. Un script destiné à afficher les nombres de 1 à 5 pourrait ressembler à ceci :
#!/bin/bash
Nombre=1
while [ $Nombre -le 5 ]
do
echo "Nombre : $Nombre"
((Nombre++))
done
Dans ce cas, la variable Nombre démarre à 1. À chaque itération, le script affiche sa valeur actuelle et l’incrémente de 1. La condition [ $Nombre -le 5 ] vérifie si le nombre est inférieur ou égal à 5. Dès que Nombre atteint 6, la condition devient fausse et la boucle s’arrête. Sans cette incrémentation, la boucle fonctionnerait indéfiniment, créant ainsi une boucle infinie.
L’opérateur -le signifie « less than or equal to » (inférieur ou égal). D’autres opérateurs couramment utilisés incluent -lt (inférieur), -gt (supérieur), -ge (supérieur ou égal), et -eq (égal). Le choix de l’opérateur dépend directement de la logique que le script doit implémenter.
Combiner plusieurs conditions dans une boucle While Bash
La plupart des scripts Bash avancés requièrent une logique plus sophistiquée que celle offerte par une simple condition. Les opérateurs logiques permettent de combiner plusieurs critères, offrant un contrôle granulaire sur l’exécution des boucles. Deux opérateurs prédominent : && (ET logique) et || (OU logique).
L’opérateur && exige que toutes les conditions soient vraies pour que la boucle continue. À l’inverse, l’opérateur || suffit qu’une seule condition soit vraie pour poursuivre l’exécution. Cette distinction s’avère capitale lors de la conception de conditions boucle complexes.
Voici un exemple utilisant l’opérateur ET :
#!/bin/bash
Nombre1=1
Nombre2=1
while [ $Nombre1 -le 10 ] && [ $Nombre2 -le 5 ]
do
echo "Nombre1 : $Nombre1 - Nombre2 : $Nombre2"
((Nombre1++))
((Nombre2++))
done
Dans cet exemple, la boucle itère tant que Nombre1 reste inférieur ou égal à 10 ET que Nombre2 reste inférieur ou égal à 5. Dès que l’une ou l’autre condition devient fausse, la boucle s’interrompt. Puisque les deux variables s’incrémentent ensemble, la boucle effectue exactement 5 itérations : elle s’arrête quand Nombre2 atteint 6, même si Nombre1 n’a atteint que 6.
Les opérateurs logiques permettent aussi de tester des conditions non-numériques. Par exemple, une programmation shell robuste pourrait vérifier si un fichier existe ET si un utilisateur dispose des permissions appropriées :
while [ -f "$fichier" ] && [ -r "$fichier" ]
do
# Traiter le fichier
done
L’opérateur -f teste l’existence du fichier, tandis que -r vérifie la permission de lecture. Les guillemets autour de la variable $fichier garantissent que le chemin fonctionne correctement même s’il contient des espaces.
Négation et conditions complexes
Pour inverser une condition, Bash propose l’opérateur ! (non logique). Cette fonctionnalité permet d’exprimer des logiques élégantes. Par exemple, boucler tant que le fichier n’existe pas :
while [ ! -f "$fichier_cible" ]
do
echo "En attente de la création du fichier..."
sleep 2
done
Cette structure s’avère particulièrement utile dans des scénarios de surveillance de fichiers ou d’attente de processus. Le script pause deux secondes entre chaque vérification, évitant ainsi une charge système excessive due à des boucles trop rapides.
| 🔧 Opérateur | Signification | Exemple d’utilisation |
|---|---|---|
| -le | Inférieur ou égal | [ $var -le 10 ] |
| -lt | Inférieur | [ $var -lt 10 ] |
| -ge | Supérieur ou égal | [ $var -ge 5 ] |
| -gt | Supérieur | [ $var -gt 5 ] |
| -eq | Égal | [ $var -eq 0 ] |
| -ne | Différent | [ $var -ne 0 ] |
| && | ET logique | [ cond1 ] && [ cond2 ] |
| || | OU logique | [ cond1 ] || [ cond2 ] |
| ! | NON logique | [ ! -f « $file » ] |
Les boucles While en Bash peuvent être combinées à des opérateurs logiques pour gérer plusieurs conditions, rendant le contrôle de flux plus flexible et puissant.

Gérer les saisies utilisateur et valider les entrées avec While
Les boucles While deviennent particulièrement utiles quand un script Bash doit interagir avec un utilisateur et valider ses entrées. Au lieu d’accepter aveuglément n’importe quelle saisie, une boucle While peut redemander une valeur jusqu’à ce que l’utilisateur fournisse des données acceptables. Cette approche améliore considérablement la robustesse et l’expérience utilisateur.
Le cas le plus simple consiste à vérifier qu’une saisie n’est pas vide. L’opérateur -z teste si une chaîne a une longueur nulle :
#!/bin/bash
while [ -z $username ]
do
echo "Veuillez saisir votre identifiant :"
read username
done
echo "Identifiant sélectionné : $username"
Le script affiche un message demandant un identifiant, puis utilise la commande read pour capturer la saisie utilisateur dans la variable $username. Si l’utilisateur appuie simplement sur Entrée sans rien taper, la variable demeure vide et la condition [ -z $username ] reste vraie, provoquant une nouvelle demande.
Plusieurs validations peuvent être enchaînées pour des contrôles plus stricts :
#!/bin/bash
while [ -z "$age" ] || ! [[ "$age" =~ ^[0-9]+$ ]]
do
echo "Veuillez saisir votre âge (nombre) :"
read age
if ! [[ "$age" =~ ^[0-9]+$ ]]; then
echo "L'âge doit être un nombre entier"
age=""
fi
done
echo "Âge enregistré : $age"
Ici, le script utilise une expression régulière (regex) pour s’assurer que la saisie contient uniquement des chiffres. L’opérateur =~ teste si le contenu de $age correspond au motif ^[0-9]+$, qui signifie « du début à la fin, uniquement des chiffres ». Si le test échoue, un message d’erreur s’affiche et la variable est réinitialisée pour relancer la boucle.
Cette approche prévient les erreurs de traitement ultérieures dues à des données invalides. Plutôt que d’obtenir un résultat incompréhensible ou un arrêt du script, l’utilisateur reçoit un feedback clair et peut corriger son erreur immédiatement.
Gestion des options et boucles interactives
Pour des scripts plus avancés, les boucles While servent souvent à créer des menus interactifs. L’utilisateur choisit une option parmi plusieurs, et le script réexécute le menu jusqu’à ce que l’utilisateur demande la fermeture :
#!/bin/bash
choice=""
while [ "$choice" != "4" ]
do
echo "=== Menu Principal ==="
echo "1. Option 1"
echo "2. Option 2"
echo "3. Option 3"
echo "4. Quitter"
read choice
case $choice in
1) echo "Vous avez choisi l'option 1" ;;
2) echo "Vous avez choisi l'option 2" ;;
3) echo "Vous avez choisi l'option 3" ;;
4) echo "Fermeture du programme" ;;
*) echo "Option invalide" ;;
esac
done
Ce modèle combine la boucle While avec une instruction case pour traiter différentes entrées utilisateur. La boucle continue jusqu’à ce que l’utilisateur saisisse « 4 », offrant une interface intuitive et reproductible.
Lecture et traitement de fichiers ligne par ligne avec While
L’une des applications les plus puissantes des boucles While consiste à traiter des fichiers volumineux ligne par ligne sans charger l’intégralité du fichier en mémoire. Cette technique s’avère indispensable pour les scripts Bash manipulant des logs, des listes de données ou des fichiers de configuration contenant des milliers d’entrées.
La syntaxe classique pour lire un fichier ligne par ligne utilise la variable IFS (Internal Field Separator) couplée à la commande read -r :
#!/bin/bash
while IFS= read -r ligne
do
echo "Traiter : $ligne"
done < "fichier.txt"
La redirection < « fichier.txt » fournit le contenu du fichier comme entrée standard à la boucle. À chaque itération, la commande read extrait une ligne et l’assigne à la variable $ligne. Le paramètre IFS= (vide) préserve les espaces au début et à la fin de chaque ligne, tandis que l’option -r traite les caractères d’échappement littéralement.
Imaginons un fichier contenant une liste d’adresses IP destinées à être bannies par CrowdSec, outil de sécurité populaire :
1.1.1.1
2.2.2.2
3.3.3.3
4.4.4.4
Un script d’automatisation pourrait traiter ce fichier ainsi :
#!/bin/bash
while IFS= read -r ip
do
echo "Ajout de la décision pour : $ip"
cscli decisions add --ip "$ip"
done < "/home/admin/ip.txt"
Le script itère sur chaque adresse IP et exécute la commande cscli decisions add pour l’ajouter à la liste des décisions de bannissement. En utilisant des guillemets autour de $ip, on s’assure que la variable fonctionne correctement même si elle contient des caractères spéciaux.
- 📄 IFS= read -r : méthode optimale pour éviter les pièges de parsing
- 🔗 Redirection < fichier : fournit le contenu du fichier à la boucle sans sous-shell
- ⚠️ Guillemets autour des variables : essentiels pour gérer les chemins avec espaces
- 🛡️ Options -r : préserve les caractères littéralement, critiques pour les données sensibles
- 🔄 Traitement séquentiel : économise la mémoire pour les fichiers volumineux
Traitement avancé avec filtrage et transformations
Les boucles While offrent la possibilité d’appliquer des transformations complexes à chaque ligne lue. Supposons qu’un fichier contienne des adresses IP accompagnées de métadonnées et qu’il faille extraire uniquement les adresses malveillantes détectées plus de 5 fois :
#!/bin/bash
while IFS='|' read -r ip count raison
do
if [ "$count" -gt 5 ]; then
echo "Bannissement de $ip ($count détections)"
cscli decisions add --ip "$ip"
fi
done < "/home/admin/menaces.txt"
Ici, l’option IFS=’|’ indique que les champs sont séparés par des pipes (|), permettant d’extraire trois valeurs par ligne : l’adresse IP, le nombre de détections et la raison. La condition vérifie si le nombre dépasse 5 avant d’exécuter l’action de bannissement.
Cette approche combine l’efficacité des boucles While avec le filtering sélectif, optimisant les ressources système tout en maintenant un code lisible et maintenable.
Pour éviter une boucle infinie, assurez-vous d’ajouter une incrémentation ou une modification de la variable contrôlant la condition.
Éviter les boucles infinies et maîtriser le contrôle de flux
Une boucle infinie représente un risque courant lors du développement de scripts Bash. Elle survient lorsque la condition reste perpétuellement vraie, ne permettant jamais à la boucle de se terminer. Le CPU consomme alors des ressources considérables jusqu’à l’interruption manuelle du script (généralement avec Ctrl+C).
Le cas classique se produit quand le développeur oublie d’incrémenter ou de modifier une variable sur laquelle repose la condition :
#!/bin/bash
nombre=1
while [ $nombre -le 10 ]
do
echo "Nombre : $nombre"
# Oubli : pas d'incrémentation !
done
Dans ce script défectueux, nombre reste à 1 indéfiniment, et la condition [ $nombre -le 10 ] demeure toujours vraie. La boucle affiche « Nombre : 1 » continuellement jusqu’à l’interruption du processus.
Pour éviter ce piège, plusieurs stratégies s’imposent. D’abord, toujours s’assurer que la boucle modifie une variable affectant la condition. Ensuite, prévoir un compteur d’itérations comme soupape de sécurité :
#!/bin/bash
nombre=1
max_iterations=1000
iterations=0
while [ $nombre -le 10 ] && [ $iterations -lt $max_iterations ]
do
echo "Nombre : $nombre"
((nombre++))
((iterations++))
done
if [ $iterations -eq $max_iterations ]; then
echo "Attention : limite d'itérations atteinte"
fi
Cette approche ajoute un garde-fou. Si pour une raison quelconque la logique principale ne termine pas correctement, le script s’interrompt après 1000 itérations et alerte l’utilisateur.
Les instructions break et continue
Bash fournit deux instructions de contrôle de flux : break et continue. L’instruction break interrompt immédiatement la boucle, tandis que continue saute le reste de l’itération actuelle et passe à la suivante.
#!/bin/bash
for i in {1..10}
do
if [ $i -eq 5 ]; then
break
fi
echo "Itération : $i"
done
Ce script affiche les nombres de 1 à 4, puis s’arrête quand i atteint 5.
#!/bin/bash
for i in {1..10}
do
if [ $i -eq 5 ]; then
continue
fi
echo "Itération : $i"
done
Ici, le nombre 5 est omis du résultat ; le script affiche 1, 2, 3, 4, 6, 7, 8, 9, 10.
Ces instructions s’avèrent particulièrement utiles pour skipper certains traitements ou quitter une boucle imbriquée. Par exemple, en traitant un fichier de données, on pourrait utiliser continue pour passer les lignes commençant par un commentaire :
#!/bin/bash
while IFS= read -r ligne
do
if [[ $ligne =~ ^# ]]; then
continue
fi
echo "Traiter : $ligne"
done < "fichier.txt"
Le script saute automatiquement toute ligne commençant par #, permettant de gérer proprement les fichiers avec commentaires.

Applications pratiques et cas d’usage réels en cybersécurité
Les boucles While jouent un rôle central dans les outils et scripts de sécurité moderne. Leur capacité à automatiser des tâches répétitives tout en maintenant un contrôle flexible les rend indispensables pour les administrateurs et les spécialistes en programmation Linux.
Un cas d’usage courant concerne la surveillance active des logs de sécurité. Un script pourrait boucler indéfiniment, vérifier régulièrement l’apparition de nouvelles menaces et déclencher des alertes :
#!/bin/bash
ligne_precedente=0
while true
do
ligne_actuelle=$(wc -l < "/var/log/auth.log")
if [ $ligne_actuelle -gt $ligne_precedente ]; then
tail -n +$((ligne_precedente+1)) "/var/log/auth.log" | grep "Failed password"
ligne_precedente=$ligne_actuelle
fi
sleep 5
done
Ce script surveille le fichier de log d’authentification. À chaque itération (toutes les 5 secondes), il vérifie si de nouvelles lignes ont été ajoutées. Si c’est le cas, il affiche uniquement les nouvelles lignes contenant « Failed password », indiquant des tentatives de connexion échouées. La boucle while true s’exécute indéfiniment jusqu’à l’interruption manuelle.
Un autre exemple concerne le nettoyage des fichiers temporaires anciens. Les administrateurs doivent souvent supprimer les fichiers d’une certaine ancienneté pour libérer de l’espace disque :
#!/bin/bash
while IFS= read -r fichier
do
echo "Suppression : $fichier"
rm "$fichier"
done < <(find /tmp -type f -mtime +7)
La commande find /tmp -type f -mtime +7 localise tous les fichiers modifiés il y a plus de 7 jours. La boucle While itère sur chaque résultat et supprime le fichier. L’utilisation de < <(commande) (substitution de process) permet d’alimenter la boucle avec les résultats de find sans créer de fichier temporaire.
Pour les équipes de sécurité, les astuces Bash impliquant les boucles While facilitent aussi la gestion des certificats SSL. Un script peut vérifier l’expiration de tous les certificats d’un serveur :
#!/bin/bash
repertoire="/etc/ssl/certs"
alerte_jours=30
while IFS= read -r certificat
do
date_expiration=$(openssl x509 -noout -enddate -in "$certificat" | cut -d= -f2)
secondes_avant_expiration=$(date -d "$date_expiration" +%s)
secondes_maintenant=$(date +%s)
jours_restants=$(( (secondes_avant_expiration - secondes_maintenant) / 86400 ))
if [ $jours_restants -lt $alerte_jours ]; then
echo "Alerte : $certificat expire dans $jours_restants jours"
fi
done < <(find "$repertoire" -name "*.crt")
Ce script parcoure tous les certificats CRT, extrait leur date d’expiration et calcule le nombre de jours restants. Si ce nombre est inférieur à 30 jours, une alerte s’affiche, permettant aux administrateurs de renouveler les certificats avant qu’ils ne deviennent inactifs.
Ces exemples concrets illustrent comment les boucles While, combinées à d’autres commandes Linux, constituent un puissant outil d’automatisation pour les tâches quotidiennes de gestion système et de sécurité. Leur flexibilité et leur clarté en font un incontournable pour tout script Bash professionnelsérieux.
Les boucles While demeurent un pilier inévitable de la programmation shell moderne, offrant une syntaxe élégante et efficace pour automatiser des processus complexes. Maîtriser leur utilisation, comprendre les pièges courants comme les boucles infinies, et savoir combiner plusieurs conditions ou appliquer des transformations élaborées au traitement de fichiers place les développeurs et administrateurs en position de force pour créer des scripts Bash robustes, maintenables et performants. De la validation des entrées utilisateur à la surveillance système en passant par le traitement batch de données sensibles, les boucles While restent un outil versatile et indispensable pour quiconque explore l’univers de l’administration Linux et de la programmation shell.








