Как сравнить две строковые переменные в операторе 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*" ]]

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

12 ответов

Решение

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

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

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

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

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

плохой:

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

хорошо:

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

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

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

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

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

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

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

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

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

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

#!/bin/bash

или же

#!/bin/sh

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

Bash4+ примеры. Примечание: неиспользование кавычек вызовет проблемы, когда слова содержат пробелы и т. Д. Всегда заключайте в кавычки 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

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

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

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

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

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

#!/bin/bash

s1="hi"
s2="hi"

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

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

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

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

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

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

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

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

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

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

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

#!/bin/bash

s1="hi"
s2="hi"

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

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

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

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

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

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

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

Другие вопросы по тегам