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?


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.


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


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


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.


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


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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.