У меня есть одна строка, и я хочу проверить, содержит ли она подстроку или нет. Поэтому я использую эту команду. Ниже приведен скрипт оболочки Linux. Я просто хочу узнать, как работает условие, присутствующее в операторе if?
STRING1='This string contains substring.'
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
echo "Substring is present"
fi
решение1
Это запутанный и специфичный для ksh (хотя теперь поддерживаемый несколькими другими оболочками) способ записи стандарта:
case $STRING1 in
*substr*) echo Substring is present
esac
Или специфичные для ksh:
if [[ $STRING1 = *substr* ]]; then
echo Substring is present
fi
${var/pattern/replacement}
— оператор расширения параметра ksh, который расширяется до значения, $var
где первое вхождение pattern
было заменено на replacement
.
То же самое ${STRING1/substr/}
и $STRING1
с первым появлением слова substr
«заменено ничем», поэтому удалено.
[[ string = pattern ]]
и [[ string != pattern ]]
— еще одна специфичная для ksh конструкция, которая сопоставляет строку с шаблоном. Когда шаблон заключен в кавычки, он воспринимается буквально, как и [[ string = "string" ]]
оператор равенства (и неравенство с !=
).
Таким образом, [[ $STRING1 != "${STRING1/substr/}" ]]
команда возвращает true, если расширение $STRING1
и ${STRING!/substr/}
дает разные строки, что может произойти только в том случае, если было хотя бы одно вхождение substr
внутри $STRING1
, поэтому это способ проверить, $STRING1
содержит ли substr
.
Хотя ни то, [[...]]
ни другое не ${var/pattern/replacement}
являются стандартным sh
синтаксисом, [
команда и ${var#pattern}
оператор (последний также происходит из ksh) являются стандартными. Поэтому иногда вы видите такой код:
if [ "$STRING1" != "${STRING1#*substr*}" ]; then
echo Substring is present
fi
Это стандартный (хотя и не Bourne) способ проверки того, что переменная содержит подстроку, но он опять же запутан и не имеет никаких преимуществ по сравнению с очевидным case
подходом с использованием операторов.
решение2
проверьте, содержит ли он подстроку
Кажется, проще выполнить
[ -z "${s##*substr*}" ] && echo Substring is present
Результатом расширения ${…}
является ноль (нулевая длина), если substr
присутствует.
... как работает условие, присутствующее в операторе if?
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
Сравнивает две строки, исходную немодифицированную и ту же строку с substr
удаленным ( /substr/}
). Если они различны ( !=
), исходная строка содержала substr
.