Historiquement, la testcommande 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 = 00est faux, mais test 0 -eq 00vrai. 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 testcommande 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 testcommande, 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 exprcommande , 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 exprobsolè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 01mais1 != 01et8 -lt 42mais8 > 42