Я пытаюсь заставить оператор 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*" ]]
но это не сработало.
Для сравнения строк используйте:
if [ "$s1" == "$s2" ]
В a
содержится b
, используйте:
if [[ $s1 == *"$s2"* ]]
(и не забудьте добавить пробелы между символами):
плохо:
if ["$s1" == "$s2"]
хорошо:
if [ "$s1" == "$s2" ]
Вам нужны пробелы:
if [ "$s1" == "$s2" ]
"$s1" == "$s2"
иначе он не будет работать. Кроме того, это тоже работает: if test "$s1" = "$s2"
Вы должны быть осторожны, чтобы оставить пробел между знаком "[" и двойными кавычками, где переменная содержит это:
if [ "$s1" == "$s2" ]; then
# ^ ^ ^ ^
echo match
fi
^
показывает пробелы, которые вам нужно оставить.
; then
и fi
части.
Я предлагаю следующее:
if [ "$a" = "$b" ]
Обратите внимание на пустое пространство между скользящими и закрывающимися скобками и переменными, а также белые пробелы, обертывающие знак "=".
Кроме того, будьте осторожны с заголовком script. Это не то же самое, если вы используете
#!/bin/bash
или
#!/bin/sh
Я бы предложил:
#!/bin/bash
s1="hi"
s2="hi"
if [ $s1 = $s2 ]
then
echo match
fi
Без двойных кавычек и только с одним равным.
У этого вопроса уже есть большие ответы, но здесь кажется, что есть небольшая путаница между использованием равных равных и двойных равных в
if [ "$s1" == "$s2" ]
Основное отличие заключается в том, что вы используете язык сценариев. Если вы используете bash, включите #!/bin/bash
в начало script и сохраните script как filename.bash
. Для выполнения использования bash filename.bash
- тогда вы должны использовать ==
.
Если вы используете sh, используйте #!/bin/sh
и сохраните script как filename.sh
. Для выполнения использования sh filename.sh
- тогда вы должны использовать одиночный =
. Избегайте их смешения.
==
" неверно. Bash поддерживает оба =
и ==
. Кроме того, если у вас есть #!/bin/bash
в начале вашего скрипта, вы можете сделать его исполняемым и запустить его как ./filename.bash
(не то, чтобы расширение файла было важным).
$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$
[[
extension будут превосходить по универсальности, надежности и удобству.
У меня нет доступа к linux-боксу прямо сейчас, но [на самом деле это программа (и bash builtin), поэтому я думаю, что вам нужно разместить пробел между [и первым параметром.
Также обратите внимание, что оператор равенства строк представляется одиночным =
Bash4+. Примечание: не использовать кавычки вызовет проблемы, когда слова содержат пробелы и т.д. Всегда указывайте в bash 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
Это больше разъяснений, чем ответ! Да, ключ находится в сообщении об ошибке:
[привет: команда не найдена
который показывает вам, что ваш "привет" был связан с "[" .
В отличие от более традиционных языков программирования, в Bash, "[" - это команда, как и более очевидная "ls" и т.д. - она не обрабатывается специально только потому, что она является символом, следовательно, "[" и ( замещенные) "$ s1", которые находятся рядом друг с другом в вашем вопросе, соединены (как правильно для Bash), и затем пытается найти команду в этой позиции: [hi - неизвестно Bash.
В C и некоторых других языках "[" будет рассматриваться как другой "класс символов" и будет несовместим со следующим "привет".
Следовательно, вам нужно пространство после открытия "[" .
Для версии с чистым Bash и без test
, но действительно уродливо, попробуйте:
if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
echo match
fi
Объяснение: В ( )
открывается дополнительная подоболочка. Он выходит с 0, если был матч, и пытается выйти с $s1, если не было совпадения, которое вызывает ошибку (уродливый). Эта ошибка направлена на /dev/null
.
command
или $ (команда). Я уверен, что вы можете проверить это, а затем сделать это лучше.
s2
содержит глобусы: чтобы исправить это, вам нужно заключить в кавычки расширение $s2
: "${s1/*"$s2"*/0}"
. Но есть и другие тонкие ошибки, которые невозможно исправить: например, если s1
- это список из 0
: s1=000000; s2=some_other_stuff
будет требовать совпадения. Поэтому я настоятельно рекомендую не использовать этот метод! Еще одна ошибка: s1=--; s2=stuff
Начиная с bash 4.4, s1=--help; s2=stuff
также будут спамить стандартный вывод.
#!/bin/bash
s1="hi"
s2="hi"
if [ "x$s1" == "x$s2" ]
then
echo match
fi
Добавление дополнительной строки внутри делает ее более безопасной.
Вы также можете использовать другие обозначения для одиночных команд:
[ "x$s1" == "x$s2" ] && echo match