[[ $a == $b ]] não é comparação, é correspondência de padrões. Você precisa de [[ $a == "$b" ]] para comparação de igualdade de byte a byte. = é o mesmo que == em qualquer shell que suporte [[...]] (introduzido por ksh ).
[[...]] não é a sintaxe sh padrão. O comando [ é padrão, e o operador padrão comparação é = (embora algumas implementações [ também reconheçam == ).
Assim como em qualquer argumento para qualquer comando, as variáveis devem ser citadas, então:
[ "$a" = "$b" ]
No padrão sh , a correspondência de padrões é feita com case :
case $a in
($b) ...
esac
Para completar, outros operadores parecidos com a igualdade que você pode encontrar em shell scripts:
-
[ "$a" -eq "$b" ]: operador[padrão para comparar números inteiros decimais. Algumas implementações[permitem espaços em branco em torno dos números, alguns permitem expressões aritméticas arbitrárias, mas isso não é portátil. Portavelmente, pode-se usar[ "$((a))" -eq "$((b))" ]para isso. Veja também[ "$((a == b))" -ne 0 ], que seria o equivalente padrão (exceto que POSIXly, o comportamento é especificado apenas se$ae$bcontiverem constantes inteiras) de: -
((a == b)), de ksh e também encontrado emzshebash, retorna verdadeiro se a avaliação da expressão aritmética armazenada em$agerar o mesmo número que a de$b. Normalmente, isso é usado para comparar números. Note que existem variações entre shells e como expressões aritméticas são avaliadas e quais números são suportados (por exemplo, bash e algumas implementações / versões de ksh não suportam ponto flutuante ou tratam números com zeros à esquerda como octal). -
expr "$a" = "$b"faz uma comparação numérica se ambos os operandos forem reconhecidos como números inteiros decimais (alguns permitindo espaços em branco ao redor do número) e, de outra forma, verifica se os dois operadores de cadeia possuem a mesma ordem de classificação. Também falharia os valores de$aou$bque sãoexprde operadores como(,substr... -
awk 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b": se$ae$bforem reconhecidos como números (pelo menos números inteiros decimais e de ponto flutuante como 1.2, -1.5e-4, espaços em branco à esquerda ignorados, alguns também reconhecendo hexadecimais, octal ou qualquer coisa reconhecida porstrtod()), então uma comparação numérica é executada. Caso contrário, dependendo da implementação, é uma comparação de cadeia de byte a byte ou semelhante à comparaçãoexprastrcoll(), isto é, se$ae$bordenam o mesmo.
Veja também: