← Retour au portail

Fiche 15 - Scripts bash — Variables, conditions et boucles

Écrire des scripts bash pour automatiser des tâches d'administration : variables, conditions, boucles, fonctions et bonnes pratiques.

Intermédiaire — SISR 1ère année ⏱️ 25 min 📁 Administration système

🎯 Objectifs de la fiche

  1. Structure d'un script bash — Shebang, permissions, exécution
  2. Variables et paramètres — Déclaration, lecture, arguments $1 $2...
  3. Conditions (if/else/case) — Tests sur fichiers, chaînes, nombres
  4. Boucles (for/while/until) — Itérer sur des listes, des fichiers
  5. Fonctions et bonnes pratiques — Réutilisation du code, gestion d'erreurs

Prérequis

Connaître les commandes Linux de base. Avoir accès à un terminal Debian. Savoir utiliser un éditeur de texte (nano, vim).

1. Structure d'un script bash

#!/bin/bash
# Ligne 1 : le shebang — indique l'interpréteur à utiliser
# Les lignes commençant par # sont des commentaires

echo "Bonjour depuis mon premier script !"
# Créer le script
nano /opt/scripts/monscript.sh

# Rendre le script exécutable
chmod +x /opt/scripts/monscript.sh

# Exécuter le script
./monscript.sh
# ou
bash /opt/scripts/monscript.sh
💡 Toujours commencer par #!/bin/bash (shebang). Sans lui, le script s'exécute dans le shell courant, ce qui peut donner des comportements inattendus.

2. Variables

#!/bin/bash

# Déclaration d'une variable (pas d'espaces autour du =)
NOM="Alice"
AGE=25
DATE=$(date +%Y-%m-%d)    # commande dans une variable

# Utiliser une variable (avec $)
echo "Bonjour $NOM, vous avez $AGE ans"
echo "Date du jour : $DATE"

# Variables spéciales
echo "Nom du script : $0"
echo "Nb d'arguments : $#"
echo "Tous les arguments : $@"
echo "Code retour dernière commande : $?"
echo "PID du script : $$"

2.1 Arguments passés au script

#!/bin/bash
# Appel : ./backup.sh /var/www /backup
SOURCE=$1       # premier argument
DEST=$2         # deuxième argument

echo "Sauvegarde de $SOURCE vers $DEST"
tar -czf "$DEST/backup-$(date +%Y%m%d).tar.gz" "$SOURCE"

3. Conditions (if / elif / else)

#!/bin/bash

# Syntaxe de base
if [ condition ]; then
    # commandes si vrai
elif [ autre_condition ]; then
    # commandes si autre condition
else
    # commandes si faux
fi
TestSignificationExemple
-f fichierLe fichier existe et est un fichier ordinaire[ -f /etc/passwd ]
-d dossierLe répertoire existe[ -d /var/www ]
-e cheminLe fichier ou dossier existe[ -e /opt/app ]
-z chaineLa chaîne est vide[ -z "$VAR" ]
-n chaineLa chaîne n'est pas vide[ -n "$VAR" ]
= ou ==Égalité de chaînes[ "$NOM" = "Alice" ]
!=Inégalité de chaînes[ "$NOM" != "Bob" ]
-eqÉgalité de nombres[ $AGE -eq 25 ]
-neDifférence de nombres[ $CODE -ne 0 ]
-gtSupérieur à (greater than)[ $NB -gt 10 ]
-ltInférieur à (lower than)[ $NB -lt 100 ]
#!/bin/bash

FICHIER="/etc/passwd"

if [ -f "$FICHIER" ]; then
    echo "Le fichier $FICHIER existe"
else
    echo "Le fichier $FICHIER n'existe pas"
fi

# Vérifier le code de retour d'une commande
ping -c 1 8.8.8.8 > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Internet accessible"
else
    echo "Pas de connectivité Internet"
fi

4. Boucles

4.1 Boucle for

#!/bin/bash

# Itérer sur une liste de valeurs
for SERVEUR in srv01 srv02 srv03; do
    echo "Ping de $SERVEUR..."
    ping -c 1 "$SERVEUR" > /dev/null && echo "  OK" || echo "  ECHEC"
done

# Itérer sur des fichiers
for FICHIER in /var/log/*.log; do
    echo "Taille de $FICHIER : $(wc -l < $FICHIER) lignes"
done

# Boucle numérique
for i in $(seq 1 10); do
    echo "Itération $i"
done

4.2 Boucle while

#!/bin/bash

COMPTEUR=0
while [ $COMPTEUR -lt 5 ]; do
    echo "Compteur : $COMPTEUR"
    COMPTEUR=$((COMPTEUR + 1))
done

# Lire un fichier ligne par ligne
while IFS= read -r LIGNE; do
    echo "Ligne : $LIGNE"
done < /etc/hosts

5. Fonctions

#!/bin/bash

# Déclaration d'une fonction
afficher_info() {
    local NOM=$1     # variable locale à la fonction
    echo "=== Informations sur $NOM ==="
    echo "Date : $(date)"
    echo "Uptime : $(uptime -p)"
}

verifier_service() {
    local SERVICE=$1
    if systemctl is-active --quiet "$SERVICE"; then
        echo "Service $SERVICE : ACTIF"
    else
        echo "Service $SERVICE : INACTIF"
    fi
}

# Appel des fonctions
afficher_info "Serveur Web"
verifier_service "ssh"
verifier_service "apache2"

6. Script complet — exemple d'administration

#!/bin/bash
# check-sante.sh — Vérification rapide de l'état du serveur

LOG="/var/log/check-sante.log"
DATE=$(date "+%Y-%m-%d %H:%M:%S")

echo "[$DATE] Début vérification" | tee -a "$LOG"

# Espace disque
USAGE=$(df / | awk 'NR==2 {print int($5)}')
if [ "$USAGE" -gt 80 ]; then
    echo "ALERTE : disque à ${USAGE}%" | tee -a "$LOG"
else
    echo "Disque OK : ${USAGE}%" | tee -a "$LOG"
fi

# Services critiques
for SERVICE in ssh apache2 mysql; do
    if systemctl is-active --quiet "$SERVICE"; then
        echo "Service $SERVICE : OK" | tee -a "$LOG"
    else
        echo "ALERTE : Service $SERVICE INACTIF" | tee -a "$LOG"
    fi
done

echo "[$DATE] Vérification terminée" | tee -a "$LOG"
Que signifie #!/bin/bash en début de script ?
  • Un commentaire
  • Le shebang — indique l'interpréteur à utiliser
  • Une directive d'import
  • La version de bash

✅ Réponse : Le shebang — indique l'interpréteur à utiliser

Comment rendre un script exécutable ?
  • chmod 644 script.sh
  • chmod +x script.sh
  • bash --exec script.sh
  • execute script.sh

✅ Réponse : chmod +x script.sh

Que contient la variable $? ?
  • Le PID du script
  • Le nombre d'arguments
  • Le code de retour de la dernière commande
  • Le nom du script

✅ Réponse : Le code de retour de la dernière commande

Quel test vérifie qu'un fichier existe et est un fichier ordinaire ?
  • [ -e fichier ]
  • [ -d fichier ]
  • [ -f fichier ]
  • [ -r fichier ]

✅ Réponse : [ -f fichier ]

Comment lire un fichier ligne par ligne en bash ?
  • for line in fichier
  • while IFS= read -r ligne; do ... done < fichier
  • read fichier | for ligne
  • cat fichier | while ligne

✅ Réponse : while IFS= read -r ligne; do ... done < fichier