$STRING1 != "${STRING1/substr/" в Linux

$STRING1 != "${STRING1/substr/" в Linux

У меня есть одна строка, и я хочу проверить, содержит ли она подстроку или нет. Поэтому я использую эту команду. Ниже приведен скрипт оболочки 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.

Связанный контент