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

Что-то, что всегда работало для меня, заключалось в том, чтобы поместить весь путь в раздел Exec следующим образом:

[Desktop Entry]
Type=Application
Name=Factorio
Exec=/home/[USERNAME]/Games/factorio/bin/x64/factorio
Terminal=false

Я точно не знаю, для чего предназначен раздел Путь . -Я никогда им не пользовался.

0
27.11.2019, 07:21
2 ответа

check if it contains the sub-string

Выполнить проще

[ -z "${s##*substr*}" ] && echo Substring is present

Результат расширения ${…}равен нулю (нулевой длины ), если substrприсутствует.


... how the condition present in if statement works? The

if [[ $STRING1 != "${STRING1/substr/}" ]]; then

Сравнивает две строки: исходную неизмененную и ту же строку с удаленным substr(/substr/}). Если они разные (!=), исходная строка содержала substr.

1
28.01.2020, 02:17

Это запутанный и специфичный для ksh -(хотя теперь поддерживаемый несколькими другими оболочками )способ написания стандарта:

case $STRING1 in
   *substr*) echo Substring is present
esac

Или кш -конкретный:

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/}дает разные строки, что может произойти, только если в $STRING1было хотя бы одно вхождение substr, так что это способ чтобы проверить, что $STRING1содержит substr.

Хотя ни [[...]], ни ${var/pattern/replacement}не являются стандартным синтаксисом sh, команда [и оператор ${var#pattern}(, последний из которых также происходит от ksh ), являются стандартными. Так что иногда вы видите такой код, как:

if [ "$STRING1" != "${STRING1#*substr*}" ]; then
  echo Substring is present
fi

Это стандартный (, хотя и не борновский )способ проверки того, что переменная содержит подстроку, но опять же запутанный и не имеющий преимуществ перед очевидным caseоператорным подходом.

3
28.01.2020, 02:17

Теги

Похожие вопросы