Objectifs
- Construire des blocs logiques avec les structures
if,elif, etelse. - Prendre des décisions en fonction du succès ou de l’échec de commandes.
- Utiliser les opérateurs
&&(ET) et||(OU) comme desifconcis. - Éviter les pyramides de
ifimbriqués en utilisantelif.
Explications détaillées
Notions clés
La structure if est le cœur de la logique de décision en scripting. Elle permet d’exécuter un bloc de code uniquement si une condition est remplie.
La structure if ... then ... fi
La forme la plus simple. Le code entre then et fi (l’inverse de if) n’est exécuté que si la commande de test renvoie un code de sortie 0 (succès).
if [[ -f "mon_fichier.txt" ]]; then
echo "Le fichier existe."
fi
Important : Le point-virgule ; peut remplacer le saut de ligne avant then si vous voulez écrire sur une seule ligne. if [[ ... ]]; then ...; fi.
Ajouter une alternative : else
Le bloc else s’exécute si la condition du if est fausse (code de sortie non-nul).
if [[ -d "/tmp/mon_app" ]]; then
echo "Le dossier de l'application est déjà là."
else
echo "Création du dossier de l'application..."
mkdir /tmp/mon_app
fi
Conditions multiples : elif
elif est la contraction de else if. Il permet de tester une série de conditions les unes après les autres, de manière beaucoup plus lisible qu’en imbriquant des if dans des else.
read -p "Entrez une note entre 0 et 20 : " note
if [[ "$note" -ge 16 ]]; then
echo "Très bien"
elif [[ "$note" -ge 12 ]]; then
echo "Bien"
elif [[ "$note" -ge 10 ]]; then
echo "Passable"
else
echo "Insuffisant"
fi
Les opérateurs de contrôle : && et ||
Ces opérateurs permettent d’enchaîner des commandes de manière conditionnelle. C’est une forme très concise de if.
commande1 && commande2:commande2s’exécute uniquement sicommande1réussit. C’est un “ET logique”.commande1 || commande2:commande2s’exécute uniquement sicommande1échoue. C’est un “OU logique”.
Syntaxe / Usages
# Forme classique
if [[ condition ]]; then
# bloc de commandes
fi
# Avec alternative
if [[ condition ]]; then
# bloc si vrai
else
# bloc si faux
fi
# Avec plusieurs branches
if [[ cond1 ]]; then
# ...
elif [[ cond2 ]]; then
# ...
else
# ...
fi
# Forme concise avec && et ||
commande_qui_doit_reussir && echo "Succès"
commande_qui_peut_echouer || echo "Échec, on fait autre chose"
Exemples
# 1. Vérifier le nombre d'arguments du script
# La variable spéciale $# contient le nombre d'arguments
if [[ $# -ne 2 ]]; then
echo "Erreur : ce script attend exactement 2 arguments." >&2
exit 1 # On quitte avec un code d'erreur
fi
echo "Nombre d'arguments correct."
# 2. Utiliser && pour un enchaînement sûr
# On ne tente de se déplacer dans le dossier que s'il a bien été créé
mkdir nouveau_dossier && cd nouveau_dossier
# 3. Utiliser || pour une action de secours
# On essaie de pinger un serveur, s'il ne répond pas, on affiche un message
ping -c 1 serveur.inconnu || echo "Le serveur ne répond pas."
Bonnes pratiques
- Utilisez
elifpour éviter les “pyramides de l’enfer” (desifimbriqués dans deselse). - Pour les enchaînements simples, préférez
&&et||à un blocifcomplet. C’est plus idiomatique et plus lisible. - Indentez toujours votre code à l’intérieur des blocs
then,elseetelifpour une meilleure lisibilité. - Pensez à gérer les cas d’erreur avec
exit 1pour signaler qu’un script a échoué.
Pièges courants
- Oublier
fi: Chaqueifdoit être terminé par unfi. Un oubli cause une erreur de syntaxe. - Confondre les opérateurs :
[ "$a" = "$b" ] && [ "$c" = "$d" ]est un test, tandis quecommande1 && commande2est un contrôle d’exécution. - Utiliser
=au lieu de==dans[[ ... ]]: Bien que=fonctionne souvent pour des raisons de compatibilité,==est plus explicite pour la comparaison de chaînes.
Exercices
-
Vérificateur d’âge :
- Écrivez un script qui demande l’âge de l’utilisateur.
- Si l’âge est inférieur à 18, il affiche “Vous êtes mineur.”
- Si l’âge est exactement 18, il affiche “Vous venez d’atteindre la majorité.”
- Sinon, il affiche “Vous êtes majeur.”
-
Backup intelligent :
- Créez un script qui vérifie si un dossier
~/backupexiste. - S’il n’existe pas, il doit le créer et afficher “Dossier backup créé.”.
- S’il existe déjà, il doit afficher “Le dossier backup existe déjà.”.
- Créez un script qui vérifie si un dossier
-
Version concise :
- Réécrivez l’exercice 2 en une seule ligne de commande en utilisant l’opérateur
||. (Indice : la commandetest -d ~/backupou[[ -d ~/backup ]]renverra un code de succès si le dossier existe).
- Réécrivez l’exercice 2 en une seule ligne de commande en utilisant l’opérateur