Ich verwende die SH-Shell und versuche, eine Zeichenfolge mit dem Wert einer Variablen zu vergleichen, aber die if
Bedingung 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?
sh
undbash
tragen die gleiche Beziehung wieC
undC++
. 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.Antworten:
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 test
sagt, dass Sie-z
für leere Zeichenfolgen übereinstimmen.quelle
ABC
oder zu zitierenXYZ
.-eq
wird verwendet, um ganze Zahlen zu vergleichen. Verwenden Sie=
stattdessen.quelle
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
quelle
"$VAR"
und nicht einfach$VAR
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.
quelle
-eq
ist der Shell-Vergleichsoperator zum Vergleichen von ganzen Zahlen. Zum Vergleichen von Zeichenfolgen müssen Sie verwenden=
.quelle
-eq
ist 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
quelle
==
nicht bei jeder Shell funktioniert.=
ist der richtige Operator zum Vergleichen von Zeichenfolgen und==
manchmal ein Synonym.Von den 4 Shells, die ich getestet habe, wird
ABC -eq XYZ
imtest
eingebauten fürzsh
und als wahr ausgewertetksh
. Der Ausdruck/usr/bin/test
ergibt false under und die eingebauten fordash
undbash
. Inksh
undzsh
werden die Zeichenfolgen in numerische Werte konvertiert und sind gleich, da sie beide 0 sind. IMO ist das Verhalten der eingebauten Zeichen fürksh
undzsh
falsch, aber die Spezifikation fürtest
ist diesbezüglich nicht eindeutig.quelle