Historicamente, o test
comando 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 test
comando 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 test
comando, 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 expr
comando , 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 expr
fosse 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 01
mas1 != 01
e8 -lt 42
mas8 > 42