Retour au cours

if then else

Objectifs

  • Construire des blocs logiques avec les structures if, elif, et else.
  • Prendre des décisions en fonction du succès ou de l’échec de commandes.
  • Utiliser les opérateurs && (ET) et || (OU) comme des if concis.
  • Éviter les pyramides de if imbriqués en utilisant elif.

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 : commande2 s’exécute uniquement si commande1 réussit. C’est un “ET logique”.
  • commande1 || commande2 : commande2 s’exécute uniquement si commande1 é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 elif pour éviter les “pyramides de l’enfer” (des if imbriqués dans des else).
  • Pour les enchaînements simples, préférez && et || à un bloc if complet. C’est plus idiomatique et plus lisible.
  • Indentez toujours votre code à l’intérieur des blocs then, else et elif pour une meilleure lisibilité.
  • Pensez à gérer les cas d’erreur avec exit 1 pour signaler qu’un script a échoué.

Pièges courants

  • Oublier fi : Chaque if doit être terminé par un fi. Un oubli cause une erreur de syntaxe.
  • Confondre les opérateurs : [ "$a" = "$b" ] && [ "$c" = "$d" ] est un test, tandis que commande1 && commande2 est 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

  1. 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.”
  2. Backup intelligent :

    • Créez un script qui vérifie si un dossier ~/backup existe.
    • 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à.”.
  3. Version concise :

    • Réécrivez l’exercice 2 en une seule ligne de commande en utilisant l’opérateur ||. (Indice : la commande test -d ~/backup ou [[ -d ~/backup ]] renverra un code de succès si le dossier existe).