Historiquement, la test
commande a existé en premier (au moins aussi loin que Unix Seventh Edition en 1979). Il a utilisé les opérateurs =
et !=
pour comparer des chaînes, et -eq
, -ne
, -lt
, etc. , pour comparer les chiffres. Par exemple, test 0 = 00
est faux, mais test 0 -eq 00
vrai. Je ne sais pas pourquoi cette syntaxe a été choisie, mais c'était peut-être pour éviter d'utiliser <
and >
, que le shell aurait analysé en tant qu'opérateurs de redirection. La test
commande a obtenu une autre syntaxe quelques années plus tard: [ … ]
équivaut à test …
.
La [[ … ]]
syntaxe conditionnelle, à l'intérieur de laquelle <
et >
peut être utilisée comme opérateur sans guillemet, a été ajoutée plus tard, dans ksh. Il a conservé la compatibilité descendante avec [ … ]
, donc il a utilisé les mêmes opérateurs, mais a ajouté <
et >
pour comparer des chaînes (par exemple, [[ 9 > 10 ]]
mais [[ 9 -lt 10 ]]
). Pour plus d'informations, voir Utilisation d'un support simple ou double - bash
Les expressions arithmétiques sont également venues plus tard que la test
commande, dans le shell Korn , à un moment donné dans les années 1980. Ils ont suivi la syntaxe du langage C, qui était très populaire dans les cercles Unix. Ils ont donc utilisé les opérateurs de C: ==
pour l'égalité, <=
pour le plus ou moins, etc.
Unix Seventh Edition n'avait pas d'expressions arithmétiques, mais il avait la expr
commande , qui implémentait également une syntaxe de type C pour les opérations entières, y compris ses opérateurs de comparaison. Dans un script shell, les caractères <
et >
devaient être cités pour les protéger du shell, par exemple if expr 1 \< 2; …
est équivalent à if test 1 -lt 2; …
. L'ajout d'expressions arithmétiques au shell a rendu la plupart des utilisations expr
obsolètes, donc ce n'est pas bien connu aujourd'hui.
Dans un script sh, vous utiliseriez généralement des expressions arithmétiques pour calculer une valeur entière et [ … ]
comparer des nombres entiers.
if [ "$((x + y))" -lt "$z" ]; then …
Dans un script ksh, bash ou zsh, vous pouvez utiliser les ((…))
deux.
if ((x + y < z)); then …
Le [[ … ]]
formulaire est utile si vous souhaitez utiliser des conditions impliquant d'autres choses que des entiers.
= != < <= > >=
comparer les chaînes .1 -eq 01
mais1 != 01
et8 -lt 42
mais8 > 42