Retour au cours

conditions test

Objectifs

  • Utiliser la commande test et son alias [ pour évaluer des conditions simples.
  • Comprendre les avantages de la syntaxe moderne [[ ... ]] et la privilégier.
  • Tester l’état de fichiers (existence, type, permissions).
  • Comparer des chaînes de caractères et des nombres avec les bons opérateurs.

Explications détaillées

Notions clés

Pour prendre des décisions, un script a besoin d’évaluer des conditions. En Bash, cela se fait principalement via la commande test ou ses équivalents [ et [[.

L’ancienne méthode : test et [

Historiquement, on utilisait la commande test.

test -f /etc/hosts

Cette commande renvoie un code de sortie 0 (vrai) si la condition est remplie, et 1 (faux) sinon. Par commodité, un alias a été créé : [. La commande suivante est strictement identique :

[ -f /etc/hosts ]

Points importants sur [ :

  • Ce n’est pas un élément de syntaxe, mais bien une commande.
  • Les espaces autour des crochets et des opérateurs sont obligatoires.
  • Il faut toujours citer les variables ("$VAR") pour éviter les erreurs si elles contiennent des espaces.

La méthode moderne : [[ ... ]]

[[ ... ]] est une construction plus récente et intégrée directement au shell Bash (ce n’est pas une commande externe). Elle est plus sûre, plus flexible et offre plus de fonctionnalités.

C’est la méthode que vous devriez toujours privilégier dans vos scripts Bash.

Avantages de [[ ... ]] :

  • Moins de risques d’erreurs avec les variables vides ou contenant des espaces.
  • Des opérateurs plus puissants comme la comparaison de motifs (=~).
  • Syntaxe plus naturelle pour les opérateurs logiques && et ||.

Les opérateurs de test

Tests sur les fichiers

  • -e fichier : Le fichier/dossier existe.
  • -f fichier : C’est un fichier régulier.
  • -d dossier : C’est un dossier.
  • -r fichier : Le fichier est lisible (read).
  • -w fichier : Le fichier est modifiable (write).
  • -x fichier : Le fichier est exécutable.

Tests sur les chaînes de caractères

  • [[ -z "$CHAINE" ]] : La chaîne est vide (zero length).
  • [[ -n "$CHAINE" ]] : La chaîne n’est pas vide (non-zero length).
  • [[ "$STR1" == "$STR2" ]] : Les chaînes sont égales.
  • [[ "$STR1" != "$STR2" ]] : Les chaînes sont différentes.
  • [[ "$STR" =~ REGEX ]] : La chaîne correspond à l’expression régulière (très puissant).

Tests sur les nombres (pour les entiers)

  • -eq : égal (equal)
  • -ne : non égal (not equal)
  • -gt : plus grand que (greater than)
  • -ge : plus grand ou égal (greater or equal)
  • -lt : plus petit que (less than)
  • -le : plus petit ou égal (less or equal)

Syntaxe / Usages

# Vérifier si un fichier existe
if [[ -f "/etc/hosts" ]]; then
  echo "Le fichier hosts existe."
fi

# Vérifier si une variable est vide
REPONSE=""
if [[ -z "$REPONSE" ]]; then
  echo "La réponse est vide."
fi

# Comparer un nombre
NOMBRE_FICHIERS=10
if [[ "$NOMBRE_FICHIERS" -gt 5 ]]; then
  echo "Il y a plus de 5 fichiers."
fi

# Combiner des conditions
if [[ -r "config.txt" && "$USER" == "admin" ]]; then
  echo "L'admin peut lire la config."
fi

Bonnes pratiques

  • Privilégiez [[ ... ]] dans tous vos nouveaux scripts. C’est plus sûr, plus lisible et plus puissant.
  • Continuez de citer vos variables ("$VAR") même dans [[ ... ]]. C’est une excellente habitude qui vous évitera des surprises.
  • 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 dans [ ... ] : if [ -f "fichier" ] est correct. if [-f "fichier"] est une erreur de syntaxe. (Moins un problème avec [[ mais l’habitude est bonne à prendre).
  • Utiliser < ou > pour comparer des nombres : Dans [[ ... ]], > et < comparent l’ordre lexicographique (alphabétique). [[ 10 < 2 ]] est vrai ! Utilisez toujours -lt (less than) et -gt (greater than) pour les nombres.
  • Comparer une chaîne vide sans guillemets dans [ : VAR="" ; if [ -n $VAR ] est vrai, ce qui est contre-intuitif. C’est l’un des nombreux bugs que [[ corrige.

Exercices

  1. Vérificateur de dossier :

    • Écrivez un script qui prend un nom de dossier en argument.
    • Le script doit afficher “Ceci est un dossier” si l’argument est un dossier qui existe, et “Ceci n’est pas un dossier” sinon.
  2. Test de privilèges :

    • Écrivez un script qui affiche “Bienvenue, admin !” si l’utilisateur qui lance le script est root, et “Accès standard” pour les autres.
    • Indice : la variable d’environnement $USER ou la commande whoami peuvent être utiles.
  3. Comparateur de nombres :

    • Créez un script qui prend deux nombres en arguments.
    • Il doit afficher si le premier est plus grand, plus petit, ou égal au second.
    • N’oubliez pas de vérifier si l’utilisateur a bien fourni deux arguments ! (Indice : la variable $# contient le nombre d’arguments).