Comment maîtriser les instructions Bash If…Else avec [[ ]], Elif et les opérateurs logiques

Parfois, les scripts Bash peuvent s’avérer très pénibles lorsque les conditions échouent ou se comportent de manière inattendue. Il ne s’agit pas toujours d’erreurs de syntaxe ; il s’agit souvent de petits problèmes comme l’oubli de guillemets, la confusion d’opérateurs ou l’utilisation d’une syntaxe de test inadaptée à vos besoins. Ces petites erreurs peuvent amener les scripts à exécuter la mauvaise branche, à ignorer des vérifications cruciales ou tout simplement à s’arrêter sans indices clairs. C’est un peu étrange, mais une fois que l’on connaît les pièges courants, écrire des conditions fiables devient beaucoup plus facile. De plus, sur certaines configurations, les scripts qui échouent la première fois peuvent fonctionner après un redémarrage ou un redémarrage du shell ; Windows et Linux ne supportent pas toujours ces problèmes.

Ce guide présente plusieurs méthodes éprouvées pour écrire des conditions Bash plus simples. Vous apprendrez à utiliser une syntaxe moderne comme [[ ]], à effectuer des opérations arithmétiques avec (( ))pour des calculs plus clairs, à garantir la portabilité avec POSIX [ ]et même à consolider la logique avec case. En procédant correctement, vos scripts s’exécuteront sans problème, sans surprise. Mieux encore, cela vous évitera ces moments de confusion frustrants où vous ne savez pas s’il s’agit de votre code ou d’un simple problème de shell.

Comment corriger les conditions Bash qui ne fonctionnent pas correctement

Méthode 1 : Écrire if...elseavec Bash[[ ]]

La [[ ]]syntaxe est en quelque sorte une version améliorée de l’ancien [ ]. Elle est plus tolérante, évite les découpages de mots accidentels, les problèmes de caractères génériques et se comporte généralement de manière plus prévisible. C’est un incontournable pour les scripts Bash modernes, surtout si vous souhaitez éviter les bugs étranges.

Voici un exemple rapide :

#!/usr/bin/env bash set -euo pipefail read -r -p "Enter a value: " val if [[ "$val" == "admin" ]]; then echo "Welcome, admin." else echo "Access limited." fi 

Notez son utilisation ==pour la correspondance de chaînes. Mettez toujours vos variables entre guillemets, même s’il ne s’agit que d’un seul mot, pour éviter les problèmes d’espaces ou de chaînes vides. C’est une petite habitude, mais elle vous épargne bien des soucis.

Comparer des chaînes et des nombres en toute sécurité

user="alice" target="alice" if [[ "$user" == "$target" ]]; then echo "Usernames match." else echo "Usernames differ." fi # Numeric comparison: read -r -p "Enter a number: " n if [[ "$n" -gt 10 ]]; then echo "Greater than 10." elif [[ "$n" -eq 10 ]]; then echo "Equal to 10." else echo "Less than 10." fi 

Assurez-vous de mettre les variables entre guillemets dans ces tests afin que les chaînes vides ou les espaces ne perturbent pas le résultat. Les comparaisons numériques utilisent -gt, -eq, etc., comme dans les scripts shell classiques.

Existence et autorisations du fichier

path="./data.txt" if [[ -f "$path" ]]; then echo "File exists." else echo "Creating file..." : > "$path" # creates an empty file fi 

Cela permet de vérifier la présence d’un fichier et, dans le cas contraire, d’en créer un. Utile pour les scripts qui initialisent des configurations ou traitent des fichiers.

Combinez plusieurs conditions avec &&et||

file="./report.log" size=5 if [[ -f "$file" ]] && [[ "$size" -ge 5 ]]; then echo "Process report." fi role="staff" if [[ "$role" == "admin" || "$role" == "staff" ]]; then echo "Privileged access granted." fi 

Cette syntaxe soignée évite les erreurs qui se produisent lorsque vous ajoutez accidentellement trop de crochets ou oubliez des espaces — le shell est pointilleux à ce sujet.

Utiliser elifpour plusieurs contrôles

status="warning" if [[ "$status" == "error" ]]; then echo "Exit immediately." exit 1 elif [[ "$status" == "warning" ]]; then echo "Log and continue." else echo "All good." fi 

C’est bien plus propre que d’écrire une série de si imbriqués. Cela permet de garder votre script lisible et moins sujet aux bugs.

Méthode 2 : Faire des mathématiques avec(( ))

Si votre script ne traite que des entiers, (( ))il s’agit d’une méthode beaucoup plus simple pour gérer les comparaisons et les calculs. C’est plus clair et plus rapide, et cela ressemble davantage à des calculs mathématiques classiques.

Exemple de comparaisons mathématiques :

a=12 b=8 if (( a > b )); then echo "a is larger." elif (( a == b )); then echo "Equal." else echo "b is larger." fi 

Lorsque vous avez plusieurs conditions numériques, enchaînez simplement avec &&ou ||à l’intérieur de (( )). C’est bien plus efficace que de mélanger les tests :

x=7 y=3 z=10 if (( (x > y) && (z >= 10) )); then echo "Threshold met." fi 

Remarque : pour la validation des entrées, vérifiez toujours si ce que vous lisez est réellement un nombre, en particulier si une entrée utilisateur est impliquée — [[ "$n" =~ ^-?[0-9]+$ ]].

Méthode 3 : Gardez-le portable avec POSIX[ ]

Si votre script doit s’exécuter dans des shells POSIX stricts ou même dans /bin/sh, utilisez [ ]. C’est plus ancien, mais toujours fiable.

#!/bin/sh a="hello" b="hello" if [ "$a" = "$b" ]; then echo "Match." else echo "No match." fi # Numeric comparison: a=5 b=30 if [ "$a" -lt "$b" ]; then echo "a is less than b." fi # String lex order: x="apple" y="banana" if [ "$x" \< "$y" ]; then echo "apple comes before banana." fi 

Assurez-vous d’échapper les signes inférieurs à lors de comparaisons de chaînes dans les shells POSIX, car sinon, le shell pourrait être confus. C’est étrange, mais c’est ainsi que POSIX gère les choses.

Méthode 4 : Simplifier avec casedes instructions

Lorsqu’une seule variable peut avoir plusieurs valeurs, caseil s’agit d’une manière plus propre de gérer les ramifications qu’un ensemble de ifs.

read -r -p "Enter mode (start|stop|status): " mode case "$mode" in start) echo "Starting...";; stop) echo "Stopping...";; status) echo "Service is running.";; *) echo "Unknown mode."; exit 1;; esac 

Et pour les matchs multiples :

level="warn" case "$level" in error|err) echo "Exit with failure."; exit 1;; warn|warning) echo "Log warning.";; info|debug) echo "Proceed normally.";; *) echo "Unrecognized level.";; esac 

Méthode 5 : Débogage et bonnes pratiques

  • Regroupez les conditions complexes entre parenthèses pour plus de clarté. Ce n’est pas obligatoire, mais cela permet de clarifier les choses.
  • À utiliser ==pour les chaînes, -eqpour les entiers et toujours entre guillemets pour les variables.
  • Activez le débogage set -xlorsque quelque chose ne fonctionne pas : il commencera à afficher chaque commande au fur et à mesure de son exécution, afin que vous puissiez repérer où cela ne va pas.
set -x # turn on tracing # your conditions here set +x # turn it off when done 
  • Gardez votre indentation cohérente, même si le shell ne s’en soucie pas : cela facilite la lecture et la correction des bugs ultérieurement.

Aide-mémoire rapide pour l’opérateur

  • Chaînes : ==, !=, -n var(non vide), -z var(vide)
  • Numéros : -eq, -ne, -gt, -lt, ou utilisez (( ))la syntaxe.
  • Fichiers : -f(existe et fichier régulier), -d(répertoire), -e(existe), -x(exécutable), etc.
  • Logique : &&(et), ||(ou), !(pas)

Conclure

En gros, la plupart des problèmes conditionnels de Bash sont dus à une syntaxe de test incorrecte, à des opérateurs erronés ou à l’absence de guillemets. Conservez-le [[ ]]pour la plupart des tâches, utilisez-le (( ))pour les mathématiques et utilisez-le [ ]si vous recherchez une compatibilité optimale. Ajoutez un peu de débogage et de validation des entrées, et vos scripts seront beaucoup plus prévisibles. Il suffit de prendre de bonnes habitudes et de comprendre le fonctionnement de chaque test.

Résumé

  • À utiliser [[ ]]pour les tests de chaînes et de fichiers — plus sûr et plus moderne.
  • Utiliser (( ))pour les mathématiques — syntaxe plus propre pour les entiers.
  • Citez toujours les variables pour éviter les surprises.
  • Utiliser casepour plusieurs branches basées sur une seule variable.
  • N’oubliez pas d’activer le débogage si les choses tournent mal ( set -x).

J’espère que cela permettra de gagner quelques heures pour déboguer ses scripts bash. Car oui, les scripts shell peuvent être complexes, mais une fois que vous maîtrisez ces tests, la frustration est bien moins grande.