Bash test : syntaxe, opérateurs et exemples de la commande de condition

Développeur utilisant la commande test Bash pour vérifier des conditions dans un script

La commande Bash test évalue une expression portant sur un fichier, une chaîne ou un nombre, puis renvoie un code de retour exploitable par une condition if : 0 si l’expression est vraie, une valeur non nulle si elle est fausse. Cette commande existe sous trois formes courantes : test expression, [ expression ] et [[ expression ]], cette dernière étant une construction propre à Bash offrant une syntaxe plus sûre. Cet article détaille ces trois formes, les principaux opérateurs de test fichier, chaîne et nombre, ainsi que les erreurs fréquentes à éviter.

Rôle de la commande test et code de retour

La commande test ne produit aucune sortie visible à l’écran : son seul résultat est un code de retour, stocké dans la variable spéciale $?. Un code 0 signifie que l’expression est vraie, tandis qu’un code différent de 0 signifie qu’elle est fausse. Cette convention suit la logique Unix classique, où 0 correspond systématiquement à un succès.

test 5 -eq 5
echo $?
# Résultat : 0 (vrai)

Ce code de retour est directement exploité par une instruction if, qui exécute son bloc uniquement lorsque la commande testée renvoie 0. Il ne faut pas confondre la commande test, qui évalue des conditions dans un script, avec les tests unitaires de scripts, qui désignent une pratique de vérification automatisée du comportement d’un programme.

Équivalence entre test, [ ] et [[ ]]

test expression et [ expression ] sont strictement équivalents : [ est en réalité une commande à part entière, qui exige un crochet fermant ] en dernier argument. Les espaces autour des crochets sont obligatoires, car [ est interprété comme une commande distincte des arguments qui suivent.

test -f "fichier.txt" && echo "Le fichier existe"
[ -f "fichier.txt" ] && echo "Le fichier existe"

[[ expression ]] est une construction conditionnelle propre à Bash, introduite comme alternative plus robuste. Elle n’exige pas de guillemets autour des variables pour éviter les erreurs liées aux chaînes vides ou contenant des espaces, et prend en charge nativement les motifs et les expressions régulières avec l’opérateur =~.

Comparatif entre [ ], [[ ]] et (( ))

Le choix entre ces trois syntaxes dépend du contexte d’utilisation, notamment du besoin de compatibilité POSIX ou de fonctionnalités avancées propres à Bash.

Lire aussi :  Renommer un fichier Linux : la commande mv et ses options 📁
SyntaxePortabilitéUsage principalParticularité
[ ]POSIX, tous les shellsTests fichiers, chaînes, nombresGuillemets fortement recommandés
[[ ]]Bash uniquementTests avancés, motifs, regexPas besoin de guillemets systématiques
(( ))Bash uniquementExpressions arithmétiquesSyntaxe naturelle type C, pas d’opérateurs -eq

En résumé, [ ] reste préférable lorsqu’un script doit rester compatible avec un shell POSIX minimal comme dash. [[ ]] est recommandé pour les scripts spécifiquement écrits pour Bash, notamment dès qu’une comparaison de motifs ou une expression régulière est nécessaire. (( )) est réservé aux comparaisons purement arithmétiques, avec une syntaxe plus proche du langage C utilisant directement ==, < ou >.

Tester l’existence et le type d’un fichier

Les tests sur les fichiers font partie des usages les plus fréquents de la commande test fichier Bash. Voici les opérateurs les plus utiles, à utiliser de préférence avec [[ ]].

[[ -e "$fichier" ]] && echo "Le chemin existe"
[[ -f "$fichier" ]] && echo "C'est un fichier ordinaire"
[[ -d "$fichier" ]] && echo "C'est un dossier"
[[ -r "$fichier" ]] && echo "Le fichier est lisible"
[[ -w "$fichier" ]] && echo "Le fichier est modifiable"
[[ -x "$fichier" ]] && echo "Le fichier est exécutable"
[[ -s "$fichier" ]] && echo "Le fichier n'est pas vide"

L’opérateur -e teste l’existence d’un chemin, quel que soit son type, tandis que -f restreint le test aux fichiers ordinaires, en excluant les dossiers ou les liens symboliques. Cette distinction évite des erreurs de logique fréquentes dans les scripts de sauvegarde ou de traitement de fichiers.

Comparer des chaînes de caractères en Bash

Pour comparer chaînes Bash, plusieurs opérateurs permettent de tester l’égalité, la différence ou la présence d’une chaîne vide.

nom="admin"
[[ "$nom" == "admin" ]] && echo "Utilisateur reconnu"
[[ "$nom" != "invite" ]] && echo "Ce n'est pas l'invité"
[[ -z "$nom" ]] && echo "La variable est vide"
[[ -n "$nom" ]] && echo "La variable contient une valeur"

Avec [ ], l’opérateur d’égalité s’écrit généralement avec un seul signe =, tandis que [[ ]] accepte aussi bien = que ==. Il reste recommandé d’entourer les variables de guillemets avec [ ], afin d’éviter une erreur unary operator expected lorsque la variable est vide ou non définie.

Lire aussi :  Excel SI contient : la formule pour tester si une cellule contient un mot ou une partie de texte

Comparer des nombres avec les opérateurs Bash

Pour comparer nombres Bash, il ne faut jamais utiliser == ou !=, réservés aux chaînes, mais des opérateurs dédiés aux entiers.

age=18
[[ "$age" -eq 18 ]] && echo "Majorité tout juste atteinte"
[[ "$age" -ge 18 ]] && echo "Majeur"
[[ "$age" -lt 18 ]] && echo "Mineur"

Les opérateurs -eq, -ne, -lt, -le, -gt et -ge correspondent respectivement à égal, différent, inférieur, inférieur ou égal, supérieur et supérieur ou égal. Pour une expression arithmétique plus lisible, (( )) permet d’utiliser directement les symboles mathématiques classiques :

(( age >= 18 )) && echo "Majeur"

Utiliser test avec if, elif et else

La commande test, sous sa forme [[ ]], s’intègre naturellement dans une structure conditionnelle complète pour enchaîner plusieurs vérifications.

if [[ -f "$fichier" ]]; then
    echo "Fichier trouvé"
elif [[ -d "$fichier" ]]; then
    echo "C'est un dossier"
else
    echo "Chemin introuvable"
fi

Cette structure évalue les conditions dans l’ordre, exécutant le premier bloc dont le test renvoie 0. Le mot-clé then doit toujours être précédé d’un point-virgule ou placé sur une nouvelle ligne, une erreur de syntaxe fréquente chez les débutants.

Combiner les conditions avec les opérateurs logiques

Plusieurs conditions peuvent être combinées à l’intérieur d’un même test, ou entre plusieurs commandes, grâce aux opérateurs logiques &&, || et !.

[[ -f "$fichier" && -r "$fichier" ]] && echo "Fichier lisible"
[[ -z "$nom" || "$nom" == "invite" ]] && echo "Accès limité"
[[ ! -f "$fichier" ]] && echo "Fichier absent"

Avec [ ], ces mêmes combinaisons nécessitent généralement les opérateurs -a et -o, aujourd’hui déconseillés au profit de commandes [ ] séparées reliées par && et ||, afin d’éviter des ambiguïtés d’interprétation.

Erreurs fréquentes avec la commande test Bash

Plusieurs messages d’erreur reviennent régulièrement lors de l’écriture de conditions Bash. L’erreur unary operator expected apparaît généralement lorsqu’une variable non guillemetée est vide, transformant l’expression en test incomplet. L’erreur integer expression expected survient lorsqu’un opérateur numérique comme -eq est utilisé sur une valeur non numérique ou une variable vide. Enfin, too many arguments se produit souvent lorsqu’une variable contient plusieurs mots non guillemetés, que [ ] interprète alors comme des arguments distincts.

L’usage systématique des guillemets autour des variables, combiné à [[ ]] pour les scripts Bash, permet d’éviter la grande majorité de ces erreurs, [[ ]] traitant en interne les variables comme des chaînes uniques même sans guillemets.

Choisir la bonne syntaxe de test selon son script 🐚

Le choix entre test, [ ], [[ ]] et (( )) dépend avant tout du contexte : [ ] pour un script devant rester compatible POSIX, [[ ]] pour un script Bash exploitant motifs et expressions régulières en toute sécurité, et (( )) pour toute comparaison arithmétique nécessitant une syntaxe lisible. Maîtriser ces trois formes et leurs opérateurs respectifs permet d’écrire des conditions Bash fiables, sans tomber dans les erreurs classiques de guillemets ou de types de comparaison.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *