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