Leia que, para comparar cadeias internas if
, precisamos usar colchetes duplos. Alguns livros dizem que a comparação pode ser feita por =
. Mas funciona com o ==
também.
#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
echo "equal"
fi
Existe uma diferença entre =
e ==
na comparação?
bash
shell-script
user3539
fonte
fonte
=
é para[
.==
é para[[
.==
, e é por isso que você deve usar=
(igualdade) com[
e==
(correspondência de padrão, com semântica que cita) com[[
. Vejahelp test
vshelp [[
.[ foo == foo ] && echo foo
certamente imprimefoo
, indicando que==
funciona com[
. No entanto, se por "é para" você quer dizer "foi planejado para ser usado com", então eu tenho uma objeção menor.[[
em primeiro lugar o que possui uma compreensão significativamente mais sutil de tokenização, divisão de palavras, etc.Respostas:
[[ $a == $b ]]
não é comparação, é correspondência de padrões. Você precisa[[ $a == "$b" ]]
fazer uma comparação de igualdade de bytes a bytes.=
é o mesmo que==
em qualquer shell que suporte[[...]]
(introduzido porksh
).[[...]]
não é umash
sintaxe padrão . O[
comando é padrão e o operador de comparação padrão existe=
(embora algumas[
implementações também reconheçam==
).Assim como em qualquer argumento de qualquer comando, as variáveis devem ser citadas, portanto:
No padrão
sh
, a correspondência de padrões é feita comcase
:Para garantir a integridade, outros operadores semelhantes à igualdade que você pode encontrar em scripts de shell:
[ "$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, outras permitem expressões aritméticas arbitrárias, mas isso não é portátil. Portably, pode-se usar[ "$((a))" -eq "$((b))" ]
para isso. Veja também[ "$((a == b))" -ne 0 ]
qual seria o equivalente padrão (exceto que POSIXly, o comportamento é especificado apenas se$a
e$b
contém constantes inteiras) de:((a == b))
, de ksh e também encontrado emzsh
andbash
, retorna true se a avaliação da expressão aritmética armazenada em$a
produzir o mesmo número que o de$b
. Normalmente, isso é usado para comparar números. Observe que há variações entre os shells sobre como as expressões aritméticas são avaliadas e quais números são suportados (por exemplo, bash e algumas implementações / versões do ksh não suportam ponto flutuante ou tratam números com zeros à esquerda como octais).expr "$a" = "$b"
faz uma comparação numérica se os dois operandos são reconhecidos como números inteiros decimais (alguns permitem espaços em branco ao redor do número) e, de outra forma, verifica se os dois operadores de sequência têm a mesma ordem de classificação. Também falharia com valores de$a
ou$b
que sãoexpr
operadores como(
,substr
...awk 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b"
: se$a
e$b
são reconhecidos como números (pelo menos números inteiros decimais e números de ponto flutuante como 1,2, -1,5e-4, espaços em branco à esquerda ignorados, alguns também reconhecendo hexadecimal, octal ou qualquer coisa reconhecida porstrtod()
), então é realizada uma comparação numérica. Caso contrário, dependendo da implementação, é uma comparação de cadeias de bytes a bytes ou como paraexpr
umastrcoll()
comparação, que é a mesma$a
e se é ou não$b
a mesma.Veja também:
fonte
Estes são equivalentes no bash:
As duas primeiras variáveis $ x não precisam ser citadas. O Bash realiza a divisão de palavras e a expansão do nome do caminho dentro [mas não dentro [[:
[[ $x = "$y" ]]
é uma comparação de cadeias, mas[[ $x = $y ]]
é uma expressão correspondente a padrão:-eq deve ser usado apenas com números inteiros:
Veja também BashFAQ / 031: Qual é a diferença entre test, [e [[? .
fonte