Les structures conditionnelles en Shell

LinuxBeginner
Pratiquer maintenant

Introduction

Dans cet atelier, vous allez découvrir comment utiliser les structures conditionnelles en programmation shell pour intégrer de la logique décisionnelle dans vos scripts. Nous aborderons la syntaxe fondamentale des instructions if-else, ainsi que les méthodes de comparaison numérique et textuelle pour évaluer des conditions. À l'issue de cette session, vous saurez concevoir des scripts shell capables de prendre des décisions en fonction de différents paramètres.

Créer votre première instruction If

Commençons par créer une instruction if simple qui vérifie si une variable nommée NAME est égale à "John".

Tout d'abord, ouvrez un terminal dans l'IDE Web. Par défaut, vous devriez vous trouver dans le répertoire /home/labex/project. En cas de doute, vous pouvez vérifier votre emplacement actuel avec la commande pwd.

Créez un nouveau fichier nommé if.sh à l'aide de la commande suivante :

touch if.sh

Cette commande génère un fichier vide nommé if.sh dans votre répertoire courant.

Maintenant, ouvrez le fichier if.sh dans l'IDE Web. Vous pouvez le faire en cliquant sur le nom du fichier dans l'explorateur de fichiers situé sur le côté gauche.

Ajoutez le contenu suivant au fichier :

#!/bin/bash

NAME="John"
if [ "$NAME" = "John" ]; then
  echo "The name is John"
fi

Analysons ce script :

  1. #!/bin/bash : C'est ce qu'on appelle le "shebang". Cela indique au système quel interpréteur utiliser pour exécuter le script. Ici, nous utilisons Bash.
  2. NAME="John" : Cette ligne crée une variable NAME et lui assigne la valeur "John".
  3. if [ "$NAME" = "John" ]; then : C'est le début de notre structure conditionnelle. Elle vérifie si la valeur de NAME est égale à "John".
    • Les crochets [ ] correspondent en réalité à une commande Bash, équivalente à la commande test.
    • Nous entourons "$NAME" de guillemets pour éviter les erreurs si la variable est vide ou contient des espaces.
    • Le point-virgule et le mot-clé then font partie de la syntaxe standard du if en Bash.
  4. echo "The name is John" : Cette ligne sera exécutée uniquement si la condition est vraie.
  5. fi : Cela marque la fin du bloc if. C'est tout simplement "if" écrit à l'envers !

Enregistrez le fichier après avoir ajouté ce contenu.

Ensuite, nous devons rendre le script exécutable. Sur les systèmes de type Unix, les fichiers ne sont pas exécutables par défaut pour des raisons de sécurité. Nous pouvons modifier cela avec la commande chmod :

chmod +x if.sh

Cette commande ajoute la permission d'exécution au fichier. Le +x signifie "ajouter l'exécution".

Maintenant, lancez le script :

./if.sh

Le ./ indique au shell de chercher le script dans le répertoire courant.

Vous devriez voir s'afficher : The name is John

Si ce message n'apparaît pas, vérifiez que vous avez bien enregistré le fichier avec le bon contenu et que vous lui avez accordé les droits d'exécution.

Ajouter une clause Else

Maintenant, enrichissons notre instruction if en ajoutant une clause else. Cela nous permet de définir ce qui doit se passer lorsque la condition est fausse.

Ouvrez à nouveau le fichier if.sh dans l'IDE Web et modifiez-le comme suit :

#!/bin/bash

NAME="Alice"
if [ "$NAME" = "John" ]; then
  echo "The name is John"
else
  echo "The name is not John"
fi

Voici les changements effectués :

  1. Nous avons modifié la variable NAME pour qu'elle devienne "Alice". Cela permet de tester le comportement lorsque la condition n'est pas remplie.
  2. Nous avons ajouté une clause else. Cette section définit l'action à entreprendre si la condition du if est fausse.
  3. Après le else, nous avons ajouté une autre commande echo qui s'exécutera si NAME n'est pas "John".

La clause else est facultative, mais elle s'avère très utile pour gérer les alternatives plutôt que de ne rien faire du tout.

Enregistrez les modifications.

Exécutez à nouveau le script :

./if.sh

Cette fois, vous devriez voir : The name is not John

C'est parce que NAME vaut désormais "Alice", donc la condition [ "$NAME" = "John" ] est fausse, et le code situé dans le bloc else est exécuté.

Essayez de remettre NAME à "John" et relancez le script. Quel résultat obtenez-vous ? C'est une excellente méthode pour vérifier que votre structure if-else fonctionne correctement dans les deux cas de figure.

Introduction à Elif

Il arrive souvent que l'on doive vérifier plusieurs conditions distinctes. C'est là que la clause elif (contraction de "else if") intervient. Modifions notre script pour gérer plusieurs noms différents.

Mettez à jour le fichier if.sh avec le contenu suivant :

#!/bin/bash

NAME="George"
if [ "$NAME" = "John" ]; then
  echo "John Lennon"
elif [ "$NAME" = "Paul" ]; then
  echo "Paul McCartney"
elif [ "$NAME" = "George" ]; then
  echo "George Harrison"
elif [ "$NAME" = "Ringo" ]; then
  echo "Ringo Starr"
else
  echo "Unknown member"
fi

Décortiquons ce script :

  1. Nous commençons avec NAME="George".
  2. Le premier if vérifie si le nom est "John".
  3. Si ce n'est pas "John", on passe au premier elif, qui vérifie si c'est "Paul".
  4. Si ce n'est pas "Paul", on passe au elif suivant pour "George".
  5. Si ce n'est pas "George", on vérifie pour "Ringo".
  6. Si aucune de ces conditions n'est remplie, on tombe dans la clause else finale qui affichera "Unknown member".

La clause elif permet de tester plusieurs conditions à la suite. Vous pouvez en utiliser autant que nécessaire. Les conditions sont évaluées dans l'ordre, et seul le bloc de code correspondant à la première condition vraie sera exécuté.

Enregistrez le fichier.

Lancez le script :

./if.sh

Vous devriez voir : George Harrison

Amusez-vous à changer la valeur de NAME ("John", "Paul", "Ringo" ou n'importe quoi d'autre) et exécutez le script à chaque fois pour observer comment la sortie s'adapte.

Comparaisons numériques

Les scripts shell peuvent également comparer des nombres. Créons un nouveau script pour illustrer cela.

Créez un fichier nommé numeric.sh :

touch numeric.sh

Ouvrez numeric.sh dans l'IDE Web et insérez le code suivant :

#!/bin/bash

NUMBER=10

if [ $NUMBER -lt 5 ]; then
  echo "The number is less than 5"
elif [ $NUMBER -eq 10 ]; then
  echo "The number is exactly 10"
elif [ $NUMBER -gt 15 ]; then
  echo "The number is greater than 15"
else
  echo "The number is between 5 and 15, but not 10"
fi

Ce script utilise des opérateurs de comparaison numérique spécifiques :

  • -lt : inférieur à (less than)
  • -eq : égal à (equal to)
  • -gt : supérieur à (greater than)

D'autres opérateurs sont également disponibles :

  • -le : inférieur ou égal à (less than or equal)
  • -ge : supérieur ou égal à (greater than or equal)
  • -ne : différent de (not equal)

Notez que nous utilisons ces opérateurs textuels au lieu des symboles < ou >. En Bash, les symboles < et > sont réservés aux redirections d'entrée/sortie et non aux comparaisons numériques dans les crochets simples.

Rendez le script exécutable et lancez-le :

chmod +x numeric.sh
./numeric.sh

Le résultat affiché devrait être : The number is exactly 10

Testez différentes valeurs pour la variable NUMBER. Par exemple, avec 20, vous obtiendrez "The number is greater than 15". Avec 7, vous obtiendrez "The number is between 5 and 15, but not 10".

Comparaisons de chaînes et opérateurs logiques

Enfin, explorons les comparaisons de chaînes de caractères et les opérateurs logiques. Créez un fichier nommé string_logic.sh :

touch string_logic.sh

Ouvrez string_logic.sh et ajoutez-y ce contenu :

#!/bin/bash

STRING1="hello"
STRING2="world"
NUMBER1=5
NUMBER2=10

if [ "$STRING1" = "hello" ] && [ "$STRING2" = "world" ]; then
  echo "Both strings match"
fi

if [ $NUMBER1 -lt 10 ] || [ $NUMBER2 -gt 5 ]; then
  echo "At least one of the number conditions is true"
fi

if [[ "$STRING1" != "$STRING2" ]]; then
  echo "The strings are different"
fi

if [[ -z "$STRING3" ]]; then
  echo "STRING3 is empty or not set"
fi

Ce script introduit plusieurs concepts avancés :

  1. Égalité de chaînes (=) : Vérifie si deux chaînes sont strictement identiques.
  2. ET logique (&&) : Cet opérateur permet de combiner deux conditions. Les deux doivent être vraies pour que l'ensemble soit validé.
  3. OU logique (||) : Cet opérateur combine aussi deux conditions, mais il suffit qu'une seule soit vraie pour valider l'ensemble.
  4. Inégalité de chaînes (!=) : Vérifie si deux chaînes sont différentes.
  5. Test de chaîne vide (-z) : Renvoie vrai si la chaîne est vide (longueur nulle).

Remarquez également l'usage des doubles crochets [[ ]] dans certains tests. Il s'agit d'une version améliorée des crochets simples, recommandée dans les scripts Bash modernes. Ils offrent plus de souplesse et évitent certains comportements imprévus liés au découpage des mots ou à l'expansion des chemins de fichiers.

Rendez le script exécutable et lancez-le :

chmod +x string_logic.sh
./string_logic.sh

Les quatre messages devraient s'afficher, car toutes les conditions du script sont remplies.

Both strings match
At least one of the number conditions is true
The strings are different
STRING3 is empty or not set

Essayez de modifier certaines valeurs (comme changer STRING1) pour voir comment cela impacte les résultats.

Résumé

Au cours de cet atelier, vous avez appris à manipuler les structures conditionnelles en programmation shell. Vous vous êtes exercé à utiliser les instructions if-else, les clauses elif, les comparaisons numériques et textuelles, ainsi que les opérateurs logiques. Ces outils sont fondamentaux pour créer des scripts shell dynamiques et intelligents.

Points clés à retenir :

  • La structure fondamentale des blocs if-else en shell.
  • L'utilisation de elif pour gérer des choix multiples.
  • Les opérateurs de comparaison numérique (-lt, -gt, -eq, etc.).
  • La comparaison de chaînes et les opérateurs logiques (&&, ||).
  • L'importance de rendre les scripts exécutables avec chmod.

N'oubliez pas que la pratique est essentielle pour maîtriser le scripting shell. Essayez de créer vos propres scripts en combinant ces concepts de manière originale. Au fur et à mesure de votre progression, ces structures conditionnelles deviendront indispensables pour automatiser des tâches complexes.