Sim, muitas diferenças. Por exemplo, =
verifica a igualdade exata da cadeia de caracteres, mas -eq
avalia aritmeticamente ambas as expressões antes de verificar a igualdade:
$ [ " 1 " -eq 1 ] && echo equal || echo not
equal
$ [ " 1 " = 1 ] && echo equal || echo not
not
$ [ +1 -eq 1 ] && echo equal || echo not
equal
$ [ +1 = 1 ] && echo equal || echo not
not
$ [ "0+1" -eq 1 ] && echo equal || echo not
equal
$ [ "0+1" = 1 ] && echo equal || echo not
not
Além disso, a string vazia é numericamente igual a zero:
$ [ "" -eq 0 ] && echo equal || echo not
equal
$ [ "" = 0 ] && echo equal || echo not
not
E toda uma outra classe de diferenças aparece quando você coloca os operadores de comparação - considerando <
vs -lt
, por exemplo:
$ [[ 2 -lt 10 ]] && echo less || echo not
less
$ [[ 2 < 10 ]] && echo less || echo not
not
Isso ocorre porque a string "2" está em ordem alfabética após a string "10" (já que 1 vem antes de 2), mas o número "2" é numericamente menor que o número "10".