Retour au cours

variables, arguments et conditions

Objectifs

  • Utiliser des variables pour stocker des données et des arguments pour rendre les scripts configurables.
  • Poser des questions et tester des conditions avec la structure [[ ... ]].
  • Contrôler le flux d’exécution d’un script avec if, elif, et else.

Pour qu’un script soit plus qu’une simple liste de commandes, il doit pouvoir prendre des décisions. C’est le rôle des variables et des structures conditionnelles.

Variables et Arguments

  • Variables : Permettent de stocker une information. VERSION="1.0"
  • Arguments ($1, $2, …) : Permettent de passer des informations au script lors de son lancement. ./mon_script.sh premier_arg deuxieme_arg
    • $1 contiendra “premier_arg”.
    • $# contiendra le nombre d’arguments (ici, 2).
#!/usr/bin/env bash
set -e

# On vérifie si un argument a été fourni
if [[ "$#" -eq 0 ]]; then
  echo "Erreur : un nom de fichier est requis."
  exit 1 # On quitte le script avec un code d'erreur
fi

# On stocke le premier argument dans une variable nommée
INPUT_FILE="$1"

echo "Traitement du fichier : $INPUT_FILE"

Les conditions avec [[ ... ]]

La structure [[ ... ]] est la manière moderne et sûre en Bash de poser une question qui renverra “vrai” ou “faux”. On l’utilise presque toujours avec un if.

Tests courants

  • Tests sur les chaînes de caractères

    • [[ "$A" == "$B" ]] : Les chaînes sont-elles égales ?
    • [[ -z "$VAR" ]] : La variable est-elle vide (zero-length) ?
    • [[ -n "$VAR" ]] : La variable n’est-elle pas vide ?
  • Tests sur les nombres

    • [[ "$A" -eq "$B" ]] : Égal (EQuals).
    • [[ "$A" -ne "$B" ]] : Non égal (Not Equal).
    • [[ "$A" -gt "$B" ]] : Plus grand que (Greater Than).
    • [[ "$A" -lt "$B" ]] : Plus petit que (Less Than).
    • [[ "$A" -ge "$B" ]] : Plus grand ou égal.
    • [[ "$A" -le "$B" ]] : Plus petit ou égal.
  • Tests sur les fichiers

    • [[ -f "$FICHIER" ]] : Existe et est un fichier ?
    • [[ -d "$DOSSIER" ]] : Existe et est un dossier ?
    • [[ -e "$CHEMIN" ]] : Le chemin existe (fichier ou dossier) ?

La structure if / elif / else

Cette structure permet d’exécuter différents blocs de code en fonction du résultat d’une condition.

#!/usr/bin/env bash
set -e

read -p "Entrez un nombre : " NOMBRE

if [[ "$NOMBRE" -gt 100 ]]; then
  echo "C'est un grand nombre !"
elif [[ "$NOMBRE" -eq 42 ]]; then
  echo "C'est la réponse universelle."
elif [[ "$NOMBRE" -lt 10 ]]; then
  echo "C'est un petit nombre."
else
  echo "C'est un nombre moyen."
fi
  • if : Le premier test.
  • elif (else if) : Si le test précédent est faux, on essaie celui-ci. On peut en avoir plusieurs.
  • else : Si aucun des tests précédents n’est vrai, on exécute ce bloc.
  • fi : Marque la fin du bloc if.

Bonnes pratiques

  • Validez toujours vos arguments au début du script. Vérifiez le nombre ($#) et si les fichiers attendus existent (-f).
  • Citez vos variables ("$VAR") dans les tests pour éviter les erreurs.
  • Utilisez les opérateurs numériques (-eq, -gt…) pour les nombres et les opérateurs de chaînes (==) pour le texte.

Pièges courants

  • Oublier les espaces : La structure [[ ... ]] est sensible aux espaces. [[ "$A"=="B" ]] est une erreur. Il faut [[ "$A" == "$B" ]].
  • Mauvais opérateurs de comparaison : if [[ "10" > "2" ]] est vrai, car > compare alphabétiquement (“1” vient avant “2”). Pour les nombres, il faut absolument utiliser -gt.

Exercices

  1. Vérificateur de permission :

    • Écrivez un script verifier.sh qui prend un nom de fichier en argument.
    • Le script doit afficher un message différent selon que :
      • Le fichier n’existe pas.
      • Le fichier existe mais n’est pas lisible.
      • Le fichier existe et est lisible.
    • Indice : [[ -r "$FICHIER" ]] teste la permission de lecture.
  2. Script de salutation avancé :

    • Écrivez un script saluer.sh qui prend un nom en argument.
    • Si l’argument est “root”, le script doit afficher “Attention, vous êtes super-utilisateur.”
    • Si l’argument est votre propre nom d’utilisateur ($USER), il doit afficher “Bonjour, maître.”
    • Dans tous les autres cas, il doit afficher “Bonjour, [nom].”
  3. Jeu “Plus ou Moins” :

    • Écrivez un script qui définit une variable NOMBRE_SECRET à 42.
    • Le script demande à l’utilisateur de deviner un nombre.
    • Utilisez if/elif/else pour lui dire si son nombre est plus grand, plus petit, ou égal au nombre secret.