web-dev-qa-db-fra.com

Comparer une chaîne en utilisant sh shell

J'utilise SH Shell et j'essaie de comparer une chaîne avec la valeur d'une variable, mais la condition if est toujours exécutée sur true. Pourquoi?

Voici du code:

Sourcesystem="ABC"

if [ "$Sourcesystem" -eq 'XYZ' ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

echo Sourcesystem Value is  $Sourcesystem ;

Même cela ne fonctionne pas:

Sourcesystem="ABC"

if [ 'XYZ' -eq "$Sourcesystem" ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

echo Sourcesystem Value is  $Sourcesystem ;

Deuxièmement, pouvons-nous faire correspondre cela avec une chaîne NULL ou vide?

149
James Bond

Vous devez utiliser l'opérateur = pour la comparaison de chaînes:

Sourcesystem="ABC"

if [ "$Sourcesystem" = "XYZ" ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

man test indique que vous utilisez -z pour faire correspondre les chaînes vides.

228
Mithrandir

-eq est utilisé pour comparer des entiers. Utilisez = à la place.

60
Piotr Praszmo

eq est utilisé pour comparer des entiers, utilisez plutôt '=', par exemple:

if [ 'AAA' = 'ABC' ];
then 
    echo "the same" 
else 
    echo "not the same"
fi

bonne chance

24
Qign20

J'ai eu le même problème, fais ça

if [ 'xyz' = 'abc' ];
then
echo "match"
fi

Remarquez les espaces. Dans ce cas, il est important que vous utilisiez un espace blanc avant et avant le signe =.

Consultez " Autres opérateurs de comparaison ".

15
Eswar Yaganti

-eq est l'opérateur de comparaison Shell permettant de comparer des entiers. Pour comparer des chaînes, vous devez utiliser =.

8
codaddict

-eq est un opérateur de comparaison mathématique. Je ne l'ai jamais utilisé pour la comparaison de chaînes, en m'appuyant sur == et != pour les comparaisons.

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
6
Jason

Sur les 4 shells que j'ai testés, ABC -eq XYZ est évalué à true dans la variable test pour zsh et ksh. L'expression est évaluée à false sous /usr/bin/test et aux commandes intégrées pour dash et bash. Dans ksh et zsh, les chaînes sont converties en valeurs numériques et sont égales puisqu'elles sont toutes deux égales à 0. IMO, le comportement des fonctions intégrées pour ksh et zsh est incorrect , mais la spécification pour test est ambiguë à ce sujet.

3
William Pursell