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

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

#!/bin/bash

s1="hi"
s2="hi"

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

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

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

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

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

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

Я пробовал

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

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

+457
источник поделиться
12 ответов

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

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

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

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

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

плохо:

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

хорошо:

if [ "$s1" == "$s2" ]
+626
источник

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

if [ "$s1" == "$s2" ]
+143
источник

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

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

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

+117
источник

Я предлагаю следующее:

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

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

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

#!/bin/bash

или

#!/bin/sh

Здесь источник.

+28
источник

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

#!/bin/bash

s1="hi"
s2="hi"

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

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

+11
источник

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

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

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

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

+9
источник
$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$
+7
источник

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

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

+6
источник

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

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

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

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

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

Следовательно, вам нужно пространство после открытия "[" .

+5
источник

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
+5
источник
#!/bin/bash

s1="hi"
s2="hi"

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

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

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

[ "x$s1" == "x$s2" ] && echo match
+2
источник

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

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

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

+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос