Historicamente, o testcomando existia primeiro (pelo menos desde a Unix Seventh Edition em 1979). Usou-se os operadores =e !=para comparar cadeias, e -eq, -ne, -lt, etc, para comparar os números. Por exemplo, test 0 = 00é falso, mas test 0 -eq 00é verdadeiro. Não sei por que essa sintaxe foi escolhida, mas pode ter sido para evitar o uso <e >, que o shell teria analisado como operadores de redirecionamento. O testcomando obteve outra sintaxe alguns anos depois: [ … ]é equivalente a test ….
A [[ … ]]sintaxe condicional, dentro da qual <e >pode ser usada como operadores sem citar, foi adicionada posteriormente, no ksh. Ele manteve a compatibilidade com versões anteriores e [ … ], portanto, usou os mesmos operadores, mas adicionou <e >comparou seqüências de caracteres (por exemplo, [[ 9 > 10 ]]mas [[ 9 -lt 10 ]]). Para obter mais informações, consulte Uso de colchetes simples ou duplos - bash
As expressões aritméticas também vieram depois do testcomando, no shell Korn , em algum momento da década de 1980. Eles seguiram a sintaxe da linguagem C, que era muito popular nos círculos Unix. Assim, eles usaram operadores de C: ==para igualdade, <=para menor ou igual, etc.
O Unix Seventh Edition não tinha expressões aritméticas, mas possuía o exprcomando , que também implementava uma sintaxe do tipo C para operações inteiras, incluindo seus operadores de comparação. Em um script de shell, os caracteres <e >tiveram que ser citados para protegê-los do shell, por exemplo, if expr 1 \< 2; …é equivalente a if test 1 -lt 2; …. A adição de expressões aritméticas ao shell fez com que a maioria dos usos exprfosse obsoleta, por isso não é bem conhecido hoje.
Em um script sh, você geralmente usaria expressões aritméticas para calcular um valor inteiro e [ … ]comparar números inteiros.
if [ "$((x + y))" -lt "$z" ]; then …
Em um script ksh, bash ou zsh, você pode usar ((…))para ambos.
if ((x + y < z)); then …
O [[ … ]]formulário é útil se você deseja usar condicionais envolvendo outras coisas além de números inteiros.
= != < <= > >=comparar cadeias .1 -eq 01mas1 != 01e8 -lt 42mas8 > 42