Vergleichen Sie einen String mit der sh-Shell

193

Ich verwende die SH-Shell und versuche, eine Zeichenfolge mit dem Wert einer Variablen zu vergleichen, aber die ifBedingung wird immer mit true ausgeführt. Warum?

Hier ist ein Code:

Sourcesystem="ABC"

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

echo Sourcesystem Value is  $Sourcesystem ;

Auch das funktioniert nicht:

Sourcesystem="ABC"

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

echo Sourcesystem Value is  $Sourcesystem ;

Zweitens können wir dies mit einer NULL oder einer leeren Zeichenfolge abgleichen?

James Bond
quelle
Zuerst brauchen Sie in der Bourne-Shell kein zusätzliches ';' Wenn ich das Skript in der Bourne-Shell teste, ist die if-Bedingung falsch. Es wird zuerst eine Warnung ausgegeben: [: ABC: Ganzzahliger Ausdruck erwartet. Die Ausgabe lautet: "Quellsystem stimmt NICHT mit ABC überein". Wie von anderen kommentiert, wird -eq für ganzzahlige Vergleiche verwendet. Verwenden Sie ein einzelnes Gleichheitszeichen für den Zeichenfolgenvergleich in der Bourne-Shell (#! / Bin / sh). Ihre Shell sollte Sie in erster Linie korrigiert haben.
Kemin Zhou
6
Abstimmung zur Wiedereröffnung. Die zitierten Dups sind für Bash-Shell, nicht für die anämische Sh-Shell, die manchmal eine Posix-Shell oder Dash ist.
JWW
1
Einverstanden und so abgestimmt. shund bashtragen die gleiche Beziehung wie Cund C++. Obwohl der für den ersten geschriebene Code im zweiten gültig ist, kann man nicht darauf vertrauen, dass die Antworten für den zweiten im ersten funktionieren.
Btilly

Antworten:

283

Sie sollten den =Operator für den Zeichenfolgenvergleich verwenden:

Sourcesystem="ABC"

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

man testsagt, dass Sie -zfür leere Zeichenfolgen übereinstimmen.

Mithrandir
quelle
2
Es ist nicht notwendig, ABCoder zu zitieren XYZ.
Ceving
29
Wenn Ihre Variable Leerzeichen enthält, ist ein Anführungszeichen erforderlich.
William Everett
1
Das Beispiel wurde angepasst, um diesen Teil @WilliamEverett klarer zu machen.
Per Lundberg
83

-eqwird verwendet, um ganze Zahlen zu vergleichen. Verwenden Sie =stattdessen.

Piotr Praszmo
quelle
5
Und achten Sie darauf, nicht doppelt gleich "==" zu verwenden
Rodrigo Caballero
35

eq wird verwendet, um ganze Zahlen zu vergleichen. Verwenden Sie stattdessen gleich '='. Beispiel:

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

Viel Glück

Qign20
quelle
Hinweis: Wenn Sie Variablen sind zu vergleichen, stellen Sie sicher , dass Sie nutzen "$VAR"und nicht einfach$VAR
Sridhar Sarnobat
21

Ich hatte das gleiche Problem, mach das

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

Beachten Sie das Leerzeichen. Es ist wichtig, dass Sie in diesem Fall nach und vor dem =Zeichen ein Leerzeichen verwenden .

Schauen Sie sich " Andere Vergleichsoperatoren " an.

Eswar Yaganti
quelle
1
in Dockerfile: / bin / sh: 1: [: =: unerwarteter Operator
Holms
10

-eqist der Shell-Vergleichsoperator zum Vergleichen von ganzen Zahlen. Zum Vergleichen von Zeichenfolgen müssen Sie verwenden =.

Codaddict
quelle
5

-eqist ein mathematischer Vergleichsoperator. Ich habe es nie für String-Vergleiche verwendet, mich auf ==und !=für Vergleiche verlassen.

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
Jason
quelle
18
Beachten Sie, dass der Operator ==nicht bei jeder Shell funktioniert. =ist der richtige Operator zum Vergleichen von Zeichenfolgen und ==manchmal ein Synonym.
Omer Dagan
3

Von den 4 Shells, die ich getestet habe, wird ABC -eq XYZim testeingebauten für zshund als wahr ausgewertet ksh. Der Ausdruck /usr/bin/testergibt false under und die eingebauten for dashund bash. In kshund zshwerden die Zeichenfolgen in numerische Werte konvertiert und sind gleich, da sie beide 0 sind. IMO ist das Verhalten der eingebauten Zeichen für kshund zshfalsch, aber die Spezifikation für testist diesbezüglich nicht eindeutig.

William Pursell
quelle
1
Danke fürs Testen. Deshalb ist die Bourne-Shell beliebt.
Kemin Zhou
zsh gibt eindeutig Folgendes aus : Ganzzahliger Ausdruck, der nach Verwendung von [ oder integriertem Test erwartet wird . Vielleicht erzwingen Sie [[ was beide als 0 auswertet, da Zeichenfolgen keine signifikanten ganzen Zahlen sind.
Code933k
@ code933k Welche Version? Es würde mich nicht wundern, wenn sich das Verhalten geändert hätte.
William Pursell
@ WilliamPursell zsh 5.7.1
Code933k