2012-06-01 2 views
103

Я использую SH shell, и я пытаюсь сравнить строку с значением переменной, но условие if всегда выполняется в true. Зачем?Сравните строку в Unix

Вот код:

Sourcesystem="ABC" 

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

echo Sourcesystem Value is $Sourcesystem ; 

Даже это не работает:

Sourcesystem="ABC" 

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

echo Sourcesystem Value is $Sourcesystem ; 

Во-вторых, мы можем соответствовать этому с NULL или пустая строка?

+0

Первый в оболочке Борна вам не нужны дополнительные «;» Когда я тестирую запуск сценария в оболочке Bourne, условие if является ложным. Сначала будет выдано предупреждение: [: ABC: ожидается целочисленное выражение. Вывод: «Sourcesystem НЕ соответствует ABC». Как отмечалось другими, -eq используется для целых сравнений. Используйте один знак равенства для сравнения строк в оболочке Bourne (#!/Bin/sh). Ваша оболочка должна была исправить вас в первую очередь. –

ответ

46

-eq используется для сравнения целых чисел. Вместо этого используйте =.

167

Вы должны использовать оператор = для сравнения строк:

Sourcesystem="ABC" 

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

man test говорит, что вы используете -z, чтобы соответствовать для пустых строк.

+1

Нет необходимости указывать 'ABC' или' XYZ'. – ceving

+8

Если ваша переменная может иметь пробелы в ней, тогда необходимо указать цитату. –

+0

Скорректированный пример, чтобы сделать эту часть более четкой @WilliamEverett. –

5

-eq - оператор математического сравнения. Я никогда не использовал его для сравнения строк, полагаясь на == и != для сравнения.

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

Обратите внимание, что оператор '==' не работает для каждой оболочки. '=' является правильным оператором для сравнения строк, а '==' иногда является синонимом. –

3

-eq является оператором сравнения оболочек для сравнения целых чисел. Для сравнения строк вам необходимо использовать =.

+6

-1: Не используйте '=='. Он действителен только в ограниченном наборе оболочек и будет производить неуказанное поведение. –

1

Из 4 снарядов, которые я тестировал, ABC -eq XYZ оценивает по истине в test встроенном для zsh и ksh. Выражение оценивается как ложное значение /usr/bin/test и встроенные значения для dash и bash. В ksh и zsh строки преобразуются в числовые значения и равны, так как они равны 0. ИМО, поведение встроенных значений для ksh и zsh неверно, но спецификация для test неоднозначна.

+0

Спасибо за тестирование. Вот почему раковина Борна популярна. –

11

У меня была такая же проблема, сделать эту

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

Обратите внимание на пробелы. Важно, чтобы вы использовали пробелы в этом случае после знака =.

Отъезд "Other Comparison Operators".

+1

в файле Dockerfile:/bin/sh: 1: [: =: неожиданный оператор – holms

6

эк используется для сравнения целых чисел используйте равным «=» вместо этого, пример:

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

удачи

Смежные вопросы