Używam powłoki SH i próbuję porównać ciąg z wartością zmiennej, ale if
warunek jest zawsze wykonywany na true. Czemu?
Oto kod:
Sourcesystem="ABC"
if [ "$Sourcesystem" -eq 'XYZ' ]; then
echo "Sourcesystem Matched"
else
echo "Sourcesystem is NOT Matched $Sourcesystem"
fi;
echo Sourcesystem Value is $Sourcesystem ;
Nawet to nie działa:
Sourcesystem="ABC"
if [ 'XYZ' -eq "$Sourcesystem" ]; then
echo "Sourcesystem Matched"
else
echo "Sourcesystem is NOT Matched $Sourcesystem"
fi;
echo Sourcesystem Value is $Sourcesystem ;
Po drugie, czy możemy dopasować to do NULL lub pustego ciągu?
sh
ibash
mają taki sam związek jakC
iC++
. Nawet jeśli kod napisany dla pierwszego jest ważny w drugim, odpowiedzi dla drugiego nie można ufać, że zadziałają w pierwszym.Odpowiedzi:
Do
=
porównania ciągów należy użyć operatora:Sourcesystem="ABC" if [ "$Sourcesystem" = "XYZ" ]; then echo "Sourcesystem Matched" else echo "Sourcesystem is NOT Matched $Sourcesystem" fi;
man test
mówi, że używasz-z
do dopasowania do pustych ciągów.źródło
ABC
aniXYZ
.-eq
służy do porównywania liczb całkowitych. Użyj=
zamiast tego.źródło
eq służy do porównywania liczb całkowitych, zamiast tego użyj równego `` = '', przykład:
if [ 'AAA' = 'ABC' ]; then echo "the same" else echo "not the same" fi
powodzenia
źródło
"$VAR"
a nie tylko$VAR
Miałem ten sam problem, zrób to
if [ 'xyz' = 'abc' ]; then echo "match" fi
Zwróć uwagę na spacje. W tym przypadku ważne jest, aby użyć spacji przed i po
=
znaku.Sprawdź „ Inne operatory porównania ”.
źródło
-eq
jest operatorem porównania powłoki do porównywania liczb całkowitych. Aby porównać ciągi, musisz użyć=
.źródło
-eq
jest matematycznym operatorem porównania. Nigdy nie używałem go do porównywania ciągów, polegania na==
i!=
do porównań .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
źródło
==
nie działa na każdej powłoce.=
jest prawidłowym operatorem do porównywania ciągów, a==
czasami jest synonimem.Spośród 4 powłok, które przetestowałem,
ABC -eq XYZ
wetest
wbudowanej funkcjizsh
iksh
. Wyrażenie ma wartość false under/usr/bin/test
i wbudowane dladash
ibash
. Wksh
izsh
, łańcuchy są konwertowane na wartości liczbowe i są równe, ponieważ oba są równe 0. IMO, zachowanie poleceń wbudowanych dlaksh
izsh
jest niepoprawne, ale specyfikacja dlatest
jest w tym przypadku niejednoznaczna.źródło