Comparar uma string no Unix
estou a usar a shell e estou a tentar comparar uma string com o valor de uma variável, mas a condição if
é sempre executada para ser verdadeira. Por quê?
Aqui está um código:
Sourcesystem="ABC"
if [ "$Sourcesystem" -eq 'XYZ' ]; then
echo "Sourcesystem Matched"
else
echo "Sourcesystem is NOT Matched $Sourcesystem"
fi;
echo Sourcesystem Value is $Sourcesystem ;
mesmo isto não está a funcionar:
Sourcesystem="ABC"
if [ 'XYZ' -eq "$Sourcesystem" ]; then
echo "Sourcesystem Matched"
else
echo "Sourcesystem is NOT Matched $Sourcesystem"
fi;
echo Sourcesystem Value is $Sourcesystem ;
em segundo lugar, podemos comparar isto com um texto nulo ou vazio?
7 answers
Deve usar o operador =
para comparação de texto:
Sourcesystem="ABC"
if [ "$Sourcesystem" = "XYZ" ]; then
echo "Sourcesystem Matched"
else
echo "Sourcesystem is NOT Matched $Sourcesystem"
fi;
man test
diz que você usa -z
para corresponder às cadeias de caracteres vazias.
-eq
é usado para comparar inteiros. Utilizar =
em vez disso.
Eu tinha o mesmo problema, fazer isto
if [ 'xyz' = 'abc' ];
then
echo "match"
fi
Repara no espaço em branco. É importante que use um espaço em branco neste caso após e antes do sinal =
.
Confira " outros operadores de comparação ".
O Eq é usado para comparar inteiros usar o equal '=' em vez , exemplo:
if [ 'AAA' = 'ABC' ];
then
echo "the same"
else
echo "not the same"
fi
Boa sorte.
-eq
é o operador de comparação de shell para comparar inteiros. Para comparar cadeias de caracteres você precisa usar =
.
-eq
é um operador de comparação matemática. Nunca o usei para comparação de cordas, confiando em ==
e !=
para comparações.
if [ 'XYZ' == 'ABC' ]; then # Double equal to will work in Linux but not on HPUX boxes it should be if [ 'XYZ' = 'ABC' ] which will work on both
echo "Match"
else
echo "No Match"
fi
Das 4 conchas que testei, {[[0]} avalia-se verdadeiro no edifício test
Para zsh
e ksh
. A expressão avalia o falso sob /usr/bin/test
e as construções para dash
e bash
. Em ksh
e zsh
, as cadeias são convertidas em valores numéricos e são iguais uma vez que são ambas 0. IMO, o comportamento dos builtins para ksh
e zsh
é incorreto, mas a especificação para test
é ambígua sobre isso.