Objectifs
- Répéter une action sur une liste d’éléments avec une boucle
for. - Exécuter un bloc de code tant qu’une condition est vraie avec une boucle
while. - Grouper du code réutilisable dans des fonctions pour organiser et clarifier vos scripts.
- Passer des arguments à vos fonctions.
Les boucles : Répéter des actions
La boucle for : Pour chaque élément…
La boucle for est idéale pour parcourir une liste d’éléments connue à l’avance (des fichiers, des nombres, des arguments).
Syntaxe : for variable in liste_elements; do ... done
# Itérer sur une liste de chaînes
for service in "nginx" "docker" "ssh"; do
echo "Vérification du statut de $service..."
systemctl status "$service"
done
# Itérer sur tous les fichiers .log du dossier courant
for logfile in *.log; do
echo "Analyse du fichier : $logfile"
# ...
done
La boucle while : Tant que…
La boucle while exécute un bloc de code tant qu’une condition est vraie. Elle est parfaite quand on ne sait pas à l’avance combien de tours de boucle seront nécessaires.
Syntaxe : while [[ condition ]]; do ... done
# Un simple compteur de 1 à 5
compteur=1
while [[ "$compteur" -le 5 ]]; do
echo "Le compteur est à : $compteur"
((compteur++)) # Incrémente le compteur
done
Un cas d’usage très courant est la lecture d’un fichier ligne par ligne :
while read -r ligne; do
echo "Ligne lue : $ligne"
done < /etc/hosts
Les fonctions : Organiser son code
Dès qu’un script grandit, le copier-coller devient votre ennemi. Les fonctions permettent de nommer un bloc de code et de le réutiliser, rendant le script plus lisible et plus facile à maintenir.
Syntaxe : nom_de_la_fonction() { ... }
Exemple de base
# Définition de la fonction
afficher_date() {
echo "---"
echo "La date et l'heure actuelles sont :"
date
echo "---"
}
# Appel de la fonction
echo "Début du script."
afficher_date
echo "Milieu du script."
afficher_date
echo "Fin du script."
Fonctions avec arguments
Les fonctions peuvent accepter des arguments, de la même manière qu’un script ($1, $2, etc.).
saluer() {
# C'est une bonne pratique de stocker les arguments dans des variables locales
local nom="$1"
echo "Bonjour, $nom !"
}
saluer "Alice"
saluer "Bob"
Le mot-clé local garantit que la variable nom n’existe qu’à l’intérieur de la fonction, ce qui évite les effets de bord.
Exemple combiné
Ce script prend une liste de services en argument et utilise une fonction pour vérifier le statut de chacun.
#!/usr/bin/env bash
set -e
verifier_service() {
local service_name="$1"
echo "--- Vérification de '$service_name' ---"
# On vérifie si le service est actif
if systemctl is-active --quiet "$service_name"; then
echo "✅ Le service est ACTIF."
else
echo "❌ Le service est INACTIF."
fi
}
# On vérifie qu'on a au moins un argument
if [[ "$#" -eq 0 ]]; then
echo "Usage: $0 <service1> <service2> ..."
exit 1
fi
# On boucle sur tous les arguments passés au script
for service_a_verifier in "$@"; do
verifier_service "$service_a_verifier"
done
Exécution : ./verifier_services.sh ssh docker non_existant
Bonnes pratiques
- Découpez votre code. Si un bloc de code fait plus de 10-15 lignes ou si vous vous apprêtez à le copier-coller, c’est probablement un bon candidat pour une fonction.
- Utilisez des variables
localà l’intérieur de vos fonctions. - Pour lire des fichiers, privilégiez
while read -r ligne; do ... done < "fichier".
Exercices
-
Boucle de fichiers :
- Créez un script qui utilise une boucle
forpour parcourir tous les fichiers du dossier/etc. - À l’intérieur de la boucle, il doit afficher “Le fichier [nom] est un fichier” s’il s’agit d’un fichier, ou “Le fichier [nom] est un dossier” s’il s’agit d’un dossier. (Indice :
if [[ -f ... ]]).
- Créez un script qui utilise une boucle
-
Fonction de calcul :
- Écrivez une fonction
multiplier()qui prend deux nombres en arguments et affiche leur produit. - Appelez cette fonction avec différents nombres pour tester.
- Écrivez une fonction
-
Script de nettoyage :
- Écrivez une fonction
supprimer_si_existe()qui prend un nom de fichier en argument. - À l’intérieur, la fonction doit vérifier si le fichier existe, et si c’est le cas, le supprimer et afficher un message. Sinon, elle affiche que le fichier n’existe pas.
- Utilisez cette fonction dans un script pour nettoyer une liste de fichiers temporaires potentiels (
/tmp/fic1.tmp,/tmp/fic2.tmp…).
- Écrivez une fonction