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?

 120
Author: the Tin Man, 2012-06-01

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.

 193
Author: Mithrandir, 2015-05-05 21:08:03

-eq é usado para comparar inteiros. Utilizar = em vez disso.

 52
Author: Piotr Praszmo, 2012-06-01 11:24:19

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 ".

 14
Author: Eswar Yaganti, 2015-12-20 13:28:00

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.
 12
Author: Qign20, 2017-05-02 14:37:54

-eq é o operador de comparação de shell para comparar inteiros. Para comparar cadeias de caracteres você precisa usar =.

 5
Author: codaddict, 2012-06-04 05:27:26

-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
 5
Author: Jason, 2013-03-06 16:08:16

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.

 1
Author: William Pursell, 2012-06-01 14:10:22