Сравните строку, используя sh shell [duplicate]

128

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

Вот какой код:

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 вам не нужны дополнительные символы ';' Когда я тестирую запуск скрипта в оболочке Bourne, условие if ложно. Сначала будет выдано предупреждение: [: ABC: ожидается целочисленное выражение. Вывод: «Система источников не соответствует ABC». Как прокомментировали другие, -eq используется для целочисленных сравнений. Используйте один знак равенства для сравнения строк в оболочке Bourne (#! / Bin / sh). Ваша оболочка должна была исправить вас в первую очередь.
  • 2
    Голосование возобновить. Упомянутые пары предназначены для оболочки bash, а не для анемичной оболочки sh, которая иногда представляет собой оболочку Posix или Dash.
Теги:
sh

7 ответов

191

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

Sourcesystem="ABC"

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

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

  • 1
    Не нужно цитировать ABC или XYZ .
  • 15
    Если ваша переменная может содержать пробелы, тогда необходимо заключить в кавычки.
Показать ещё 2 комментария
57

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

  • 0
    И обратите внимание, чтобы не использовать двойное равенство "=="
15

eq используется для сравнения целых чисел, используя вместо этого '=', Пример:

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

удача

14

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

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

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

Отъезд Другие операторы сравнения.

  • 1
    в Dockerfile: / bin / sh: 1: [: =: неожиданный оператор
7

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

6

-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
  • 12
    Обратите внимание, что оператор == работает не на всех оболочках. = является правильным оператором для сравнения строк, а == иногда является синонимом.
1

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню