2012-06-01 16 views
103

Używam powłoki SH i próbuję porównać ciąg z wartością zmiennej, ale warunek if jest zawsze wykonywany na wartość true. Czemu?Porównaj ciąg znaków w systemie Unix

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, możemy dopasować to z null lub pusty ciąg?

+0

pierwsze w Bourne Shell nie trzeba dodatkowych ';' Kiedy testuję uruchomienie skryptu w powłoce Bourne'a, warunek if jest fałszywy. Najpierw ostrzeżesz: [: ABC: oczekiwane wyrażenie całkowite. Wyjście to: "System źródłowy NIE jest dopasowany ABC". Jak zauważyli inni, -eq jest używane do porównań całkowitych. Użyj pojedynczego znaku równości do porównania ciągów w powłoce Bourne'a (#!/Bin/sh). Twoja powłoka powinna była cię poprawić. –

Odpowiedz

46

-eq służy do porównywania liczb całkowitych. Zamiast tego użyj =.

167

Należy użyć operatora = dla porównania ciągów:

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 dopasować do pustych strunach.

+1

Nie jest konieczne podawanie "ABC" lub "XYZ". – ceving

+8

Jeśli zmienna może zawierać spacje, konieczne jest cytowanie. –

+0

Poprawiono przykład, aby ta część była wyraźniejsza @WilliamEverett. –

5

-eq to operator porównania matematycznego. Nigdy nie używałam go do porównywania ciągów, bazując na porównaniach == i !=.

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 
+5

Należy zauważyć, że operator '==' nie działa na każdej powłoce. '=' jest poprawnym operatorem do użycia w celu porównania łańcuchów, a '==' jest czasami synonimem. –

3

-eq to operator porównujący powłoki do porównywania liczb całkowitych. Aby porównać łańcuchy, musisz użyć =.

+6

-1: Nie używaj '=='. Jest on ważny tylko w ograniczonym zestawie powłok i powoduje nieokreślone zachowanie. –

1

Z 4 skorup, które przetestowałem, ABC -eq XYZ ma wartość true w test wbudowanym dla zsh i ksh. Wyrażenie ma wartość false pod numerem /usr/bin/test i wbudowane dla dash i bash. W ksh i zsh, ciągi są konwertowane na wartości liczbowych i są równe, ponieważ są one zarówno 0. IMO, zachowanie się builtins dla ksh i zsh jest nieprawidłowy, ale spec test jest niejednoznaczne w tej sprawie.

+0

Dzięki za testowanie. Właśnie dlatego powłoka Bourne'a jest popularna. –

11

miałem ten sam problem, to zrobić

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

Zauważ spacje. Ważne jest, aby w tym przypadku użyć spacji po i przed znakiem =.

Sprawdź "Other Comparison Operators".

+1

w Dockerfile:/bin/sh: 1: [: =: nieoczekiwany operator – holms

6

eq używana jest do porównywania liczb całkowitych używać równy '=' zamiast przykład:

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

powodzenia

Powiązane problemy