Comparaison de chaines

© Christian PAULUS. Document créé le 13 septembre 2010 , mis à jour le 13 septembre 2010.

Un idiot pauvre est un idiot, un idiot riche est un riche. Paul Laffitte

Accueil du site > Astuces > Unix > Comparaison de chaines

shell sh / FreeBSD 7, MacOS X, Linux

Sous le shell le plus primitif (primaire ?) qu’il puisse exister : /bin/sh, la comparaison de chaines de caractères donne t’elle le même résultat quelque soit le système utlisé ? Rien n’est moins sûr.

Le résultat est même parfois bien surprenant !

Exemple sur le test d’égalité de chaînes de caractères

En général, le test d’égalité est du style : $a = $b

Quelques exemples sur la toile - souvent fort bien documentés - précisent même que l’opérateur de comparaison peut être == et que la comparaison multiple - deux comparaisons chainées - peut être utilisée sans risque.

Juste pour tester quelques tests proposés çà et là, six méthodes de comparaison de chaînes, identiques dans le principe et qui devraient donner le même résultat :

#!/bin/sh

uname -sr

T="ici"
V="la"

if [ "$T" = "ici" ]; then
       if [ "$V" = "la" ]; then
               echo "$T et $V"
       fi
fi

if [[ "$T" = "ici" && "$V" = "la" ]]; then
       echo "$T et $V"
fi

if [ "$T" = "ici" ] && [ "$V" = "la" ]; then
       echo "$T et $V"
fi

if [ "$T" == "ici" ]; then
       if [ "$V" == "la" ]; then
               echo "$T et $V"
       fi
fi

if [[ "$T" == "ici" && "$V" == "la" ]]; then
       echo "$T et $V"
fi

if [ "$T" == "ici" ] && [ "$V" == "la" ]; then
       echo "$T et $V"
fi

Et voici quelques résultats obtenus :

FreeBSD 7.0-RELEASE-p11
ici et la
[[: not found
ici et la
[: ici: unexpected operator
[[: not found
[: ici: unexpected operator
Darwin 10.4.0
ici et la
ici et la
ici et la
ici et la
ici et la
ici et la
Linux 2.6.18.8-xenU
ici et la
ici et la
ici et la
ici et la
ici et la
ici et la

Ce billet n’est pas une révolution. Nombreux sont ceux qui connaissent ce genre de .... comportement.

Et peut-être n’est-ce pas inutile de le rappeler.

Plussoyez !

Les forums sont fermés.