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

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

#!/bin/bash

s1="hi"
s2="hi"

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

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

[hi: command not found

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

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

Я только что разобрался с пробелами... :/ Как мне сказать contains?

Я пробовал

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

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

Комментарии к вопросу (1)
Решение

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

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

Для " А "содержится " б", используйте:

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

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

плохо:

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

хорошо:

if [ "$s1" == "$s2" ]
Комментарии (7)

Вам нужны пространства:

if [ "$s1" == "$s2" ]
Комментарии (4)

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

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

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

Комментарии (3)

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

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

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

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

#!/bin/bash

или

#!/bin/sh

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

Комментарии (4)

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

#!/bin/bash

s1="hi"
s2="hi"

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

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

Комментарии (3)

Bash4+ примеры. Примечание: не используете кавычки, то будут возникать проблемы, когда слова содержат пробелы и т. д.. всегда привожу в bash ИМО.

Вот некоторые примеры 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
Комментарии (1)

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

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

Основное различие лежит в какой скриптовый язык ты используешь. Если вы используете Баш затем включить #!/бин/баш в начале скрипта и сохранить скрипт в файл.Баш. Для выполнения используйте Баш именем.Баш - то вам придется использовать ==.

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

Комментарии (6)
$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$
Комментарии (1)

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

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

Комментарии (1)

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

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

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

В отличие от более традиционных языков программирования, в bash, то "[" это команда, как и еще более очевидно, что "ЛС" и т. д. - это'ы не обрабатываются только потому, что это'символ, отсюда и"[" и (замещенных) " и$С1", у которых сразу рядом друг с другом в вашем вопросе соединяются (как правильно на баше) и он пытается найти команду в таком положении: [привет - неизвестный Баш.

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

Значит вам нужен пробел после открывающей и"[" по.

Комментарии (0)

Для версии с чисто bash и без "тест", но очень некрасиво, попробуйте:

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

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

Комментарии (2)
#!/bin/bash

s1="hi"
s2="hi"

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

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

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

[ "x$s1" == "x$s2" ] && echo match
Комментарии (2)