it-swarm.com.ru

Как сравнить две строковые переменные в операторе if в Bash?

Я пытаюсь заставить оператор if работать в Bash (используя bunt ):

#!/bin/bash

s1="hi"
s2="hi"

if ["$s1" == "$s2"]
then
  echo match
fi

Я пробовал различные формы оператора if, используя [["$s1" == "$s2"]], с кавычками и без них, используя =, == и -eq, но я все еще получаю следующую ошибку:

[привет: команда не найдена

Я просмотрел различные сайты и руководства и скопировал их, но это не работает - что я делаю не так?

В конце концов, я хочу сказать, если $s1 содержит $s2, так как я могу это сделать?

Я только что проработал пробелы немного ...:/Как я могу сказать, содержит?

Я старался

if [[ "$s1" == "*$s2*" ]]

но это не сработало.

540
Mr Shoubs

Для сравнения строк используйте:

if [ "$s1" == "$s2" ]

Для a содержит b, используйте:

if [[ $s1 == *"$s2"* ]]

(и не забудьте добавить пробелы между символами):

плохой:

if ["$s1" == "$s2"]

хорошо:

if [ "$s1" == "$s2" ]
755
marcog

Вам нужны пробелы:

if [ "$s1" == "$s2" ]
149
unwind

Вы должны быть осторожны, чтобы оставить пробел между знаком '[' и двойными кавычками, где переменная содержит это:

if [ "$s1" == "$s2" ]; then
#   ^     ^  ^     ^
   echo match
fi

^s показывает пробелы, которые вам нужно оставить.

131
trejo08

Я предлагаю это:

if [ "$a" = "$b" ]

Обратите внимание на пробел между открывающими/закрывающими скобками и переменными, а также пробелы, заключающие знак "=".

Также будьте осторожны с заголовком вашего скрипта. Это не одно и то же, используете ли вы

#!/bin/bash

или же

#!/bin/sh

Вот источник .

31
Abderrazak BOUADMA

Я бы предложил:

#!/bin/bash

s1="hi"
s2="hi"

if [ $s1 = $s2 ]
then
  echo match
fi

Без двойных кавычек и только с одним равенством.

15
jzrk

Bash4 + примеры. Примечание: не использование кавычек вызовет проблемы, когда слова содержат пробелы и т.д. Всегда заключайте в кавычки bash IMO.

Вот несколько примеров BASH4 +:

Пример 1, проверьте "да" в строке (без учета регистра):

if [[ "${str,,}" == *"yes"* ]] ;then

Пример 2, проверьте "да" в строке (без учета регистра):

if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

Пример 3, проверьте "да" в строке (с учетом регистра):

 if [[ "${str}" == *"yes"* ]] ;then

Пример 4, проверьте "да" в строке (с учетом регистра):

 if [[ "${str}" =~ "yes" ]] ;then

Пример 5, точное совпадение (с учетом регистра):

 if [[ "${str}" == "yes" ]] ;then

Пример 6, точное совпадение (без учета регистра):

 if [[ "${str,,}" == "yes" ]] ;then

Пример 7, точное совпадение:

 if [ "$a" = "$b" ] ;then
14
Mike Q

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

if [ "$s1" == "$s2" ]

Основное различие заключается в том, какой язык сценариев вы используете. Если вы используете bash, включите #!/bin/bash в начало скрипта и сохраните ваш скрипт как filename.bash. Для выполнения используйте bash filename.bash - тогда вы должны использовать ==.

Если вы используете sh, тогда используйте #!/bin/sh и сохраните ваш скрипт как filename.sh. Для выполнения используйте sh filename.sh - тогда вы должны использовать один =. Избегайте их смешивания.

12
Rahul Dahiya
$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$
8
qwerty

У меня сейчас нет доступа к linux box, но [на самом деле это программа (и встроенная bash), поэтому я думаю, что вы должны поставить пробел между [и первым параметром.

Также обратите внимание, что оператор равенства строк выглядит как одиночный =

6
Mrki

Это больше разъяснения, чем ответа! Да, подсказка в сообщении об ошибке:

[привет: команда не найдена

который показывает вам, что ваш "привет" был соединен с "[".

В отличие от более традиционных языков программирования, в Bash "[" - это команда, аналогичная более очевидным "ls" и т.д. - она ​​не обрабатывается специально только потому, что это символ, поэтому "[" и (замещенный) "$ s1" ", которые находятся непосредственно рядом друг с другом в вашем вопросе, объединяются (как это правильно для Bash), и затем он пытается найти команду в этой позиции: [hi - которая неизвестна Bash.

В C и некоторых других языках символ "[" будет рассматриваться как другой "класс символов" и будет отличаться от следующего "hi".

Следовательно, после пробела "[" требуется пробел.

5
MikeW

Для версии с чистым Bash и без test, но безобразно, попробуйте:

if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
   echo match
fi

Объяснение: В ( ) открывается дополнительная подоболочка. Он завершается с 0, если было совпадение, и пытается выйти с $ s1, если не было совпадения, что вызывает ошибку (безобразно). Эта ошибка направлена ​​на /dev/null.

2
user2546460
#!/bin/bash

s1="hi"
s2="hi"

if [ "x$s1" == "x$s2" ]
then
  echo match
fi

Добавление дополнительной строки внутри делает его более безопасным.

Вы также можете использовать другие обозначения для однострочных команд:

[ "x$s1" == "x$s2" ] && echo match
2
mpapis