Как сравнить две строковые переменные в операторе " 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" ]; 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
- тогда вы должны использовать один =
. Не смешивая их.
У меня нет доступа к коробке 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
.