Un opérateur de comparaison binaire compare deux variables ou quantités. Notez que la comparaison entre entiers et chaînes utilisent un différent ensemble d'opérateurs.
est égal à
if [ "$a" -eq "$b" ]
n'est pas égal à
if [ "$a" -ne "$b" ]
est plus grand que
if ["$a" -gt "$b" ]
est plus grand ou égal à
if [ "$a" -ge "$b" ]
est plus petit que
if [ "$a" -lt "$b" ]
est plus petit ou égal à
if [ "$a" -le "$b" ]
est plus petit que (à l'intérieur de parenthèses doubles)
[(("$a" < "$b"))
est inférieur ou égal à (dans des doubles-parenthèses)
(("$a"< "$b"))
est plus grand que (à l'intérieur de parenthèses doubles)
(("$a" > "$b"))
est plus grand ou égal à (à l'intérieur de parenthèses doubles)
(("$a" >= "$b"))
comparaison de chaînes de caractères
if [ "$a" = "$b" ]
DIFF63
Note the whitespace framing the =.
if [ "$a"="$b" ] is not equivalent to the above.
est égal à
if [ "$a" == "$b" ]
Ceci est un synonyme de =.
L'opérateur de comparaison == se comporte différemment à l'intérieur d'un test à double crochets qu'à l'intérieur de crochets simples.
[[ $a == z* ]] # Vrai si $a commence
# avec un "z" (correspondance d'expression rationnelle).
[[ $a == "z*" ]] # Vrai si $a est égal à z* (correspondance littérale).
[ $a == z* ] # Correspondance de fichiers et découpage de mots.
[ "$a" == "z*" ] # Vrai si $a est égal à z* (correspondance littérale).
# Merci à Stéphane Chazelas
n'est pas égal à
if [ "$a" != "$b" ]
Cet opérateur utilise la reconnaissance de motifs à l'intérieur d'expressions en [[ ... ]].
est plus petit que, dans l'ordre alphabétique ASCII
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
Notez que, s'il se trouve dans une expression en [ ], « < » doit être précédé d'un caractère d'échappement.
est plus grand que, d'après l'ordre alphabétique ASCII
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
Notez que « > » a besoin d'être dans une séquence d'échappement s'il se trouve à l'intérieur de [ ].
Voir l'Exemple 27.10, « Le tri bulle : Bubble Sort » pour une application de cet opérateur de comparaison.
la chaîne de caractères est vide, c'est-à-dire qu'elle est de longueur nulle
String='' # Zero-length ("null") string variable.
if [ -z "$String" ]
then
echo "\$String is null."
else
echo "\$String is NOT null."
fi # $String is null.
la chaîne de caractères n'est pas vide.
Attention : Le test -n nécessite absolument que la chaîne de caractères soit entre guillemets à l'intérieur des crochets de test. Utiliser une chaîne sans guillemets avec ! -z, voire simplement la chaîne sans guillemets à l'intérieur des crochets (voir l'Exemple 7.6, « Vérification si une chaîne est vide ») fonctionne habituellement mais c'est une pratique risquée. Placez toujours vos chaînes de caractères à tester entre guillemets. [34]
Exemple 7.7. zmore
#!/bin/bash
#Visualiser des fichiers gzip avec 'more'
SANSARGS=65
PASTROUVE=66
NONGZIP=67
if [ $# -eq 0 ] # même effet que: if [ -z "$1" ]
# $1 peut exister mais doit être vide: zmore "" arg2 arg3
then
echo "Usage: `basename $0` nomfichier" >&2
# Message d'erreur vers stderr.
exit $SANSARGS
# Renvoie 65 comme code de sortie du script (code d'erreur).
fi
nomfichier=$1
if [ ! -f "$nomfichier" ] # Mettre $nomfichier entre guillemets permet d'avoir
#+ des espaces dans les noms de fichiers.
then
echo "Fichier $nomfichier introuvable !" >&2
# Message d'erreur vers stderr.
exit $PASTROUVE
fi
if [ ${nomfichier##*.} != "gz" ]
# Utilisation de crochets pour la substitution de variables.
then
echo "Le fichier $1 n'est pas compressé avec gzip !"
exit $NONGZIP
fi
zcat $1 | more
# Utilise le filtre 'more'.
# Peut se substituer à 'less', si vous le souhaitez.
exit $? # Le script renvoie le code d'erreur du tube.
# En fait, "exit $?" n'est pas nécessaire, car le script retournera, pour
#+ chaque cas, le code de sortie de la dernière commande exécutée.
Elles sont similaires aux opérateurs de comparaison Bash && et ||, utilisés à l'intérieur de double crochets.
[[ condition1 && condition2
]]
Les opérateurs -o et -a fonctionnent avec la commande test ou à l'intérieur de crochets simples de test.
if [ "$expr1" -a "$expr2" ] then echo "expr1 and expr2 sont vraies toutes les deux" else echo "expr1 est fausse ou bien expr2 est fausse" fi
Cependant, comme le remarque rihad :
[ 1 -eq 1 ] && [ -n "`echo true 1>&2`" ] # vrai [ 1 -eq 2 ] && [ -n "`echo true 1>&2`" ] # (aucune sortie) # ^^^^^^^ Condition fausse. Jusque là, tout se passe comme prévu. # Mais ... [ 1 -eq 2 -a -n "`echo true 1>&2`" ] # vrai # ^^^^^^^ Condition fausse. Alors, pourquoi cette sortie "true" ? # Est-ce parce que les deux clauses conditionnelles entre crochets s'évaluent ? [[ 1 -eq 2 && -n "`echo true 1>&2`" ]] # (aucune sortie) # Non, ce n'est pas cela. # Apparemment, && et || "court-circuitent" tandis que -a et -o ne le font pas.
Reportez-vous à l'Exemple 8.3, « Tests de conditions composées en utilisant && et || », à l'Exemple 27.16, « Simuler un tableau à deux dimensions, puis son test » et à l'Exemple A.29, « Chasse aux spammeurs » pour voir des opérateurs de comparaison composée en action.
[34] Comme S.C. l'a indiqué, dans un test composé, placer la variable chaîne de caractères entre guillemets simples(') peut ne pas suffire. [ -n "$chaine" -o "$a" = "$b" ] peut provoquer une erreur avec certaines versions de Bash si $chaine est vide. La façon la plus sûre est d'ajouter un caractère supplémentaire aux variables potentiellement vides, [ "x$chaine" != x -o "x$a" = "x$b" ] (les « x » sont annulés).