Retour au cours

boucles et fonctions : automatiser des tâches répétitives

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

  1. Boucle de fichiers :

    • Créez un script qui utilise une boucle for pour 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 ... ]]).
  2. 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.
  3. 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…).