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

Я пытаюсь получить if заявление на работу в Баш (через 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" ]

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

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

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


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

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

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

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

#!/bin/bash

или

#!/bin/sh

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


Я предлагаю:

#!/bin/bash

s1="hi"
s2="hi"

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

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


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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

Пример 4, Проверьте " да " в строке (case sensitive):

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

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

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

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

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

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

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

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

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

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

В отличие от более традиционных языков программирования, в 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

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

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

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