Форум русскоязычного сообщества Ubuntu


Автор Тема: Как определить наличие подстроки в строке?  (Прочитано 969 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн jack_solovey

  • Автор темы
  • Активист
  • *
  • Сообщений: 853
  • Mate, и никаких Unity
    • Просмотр профиля
Здравствуйте.
Требуется в баш скрипте определить, имеется ли в строке переданной параметром в скрипт, определенная подстрока.
например имеется ли в $1 кусок 'zzz'
Нагуглил массу противоречивых советов. Но большинство из них касается поиска текста в файле и файлах.
А вот как искать в строковой переменной не могу понять.
Имеется ли аналог функции pos/posindex/index в баше?

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6015
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Если пофиг на совместимость с sh то [[ "$1" =~ zzz ]]Более портабельно использовать casecase $1 in
    *zzz*) … ;;
esac
Имеется ли аналог функции pos/posindex/index в баше?
Есть expr для сравнений с операторами match и index, но это уже лишнее.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн jack_solovey

  • Автор темы
  • Активист
  • *
  • Сообщений: 853
  • Mate, и никаких Unity
    • Просмотр профиля
Спасибо, получилось.

пример, если в имени файла $st содержится 'sql' и 'full' то...
if [ `expr "$st" : '.*\(sql\)'` = "sql" ] && [ `expr "$st" : '.*\(full\)'` = "full" ]
then ...
else ...
fi

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6015
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
case $st in
*sql|*full) … ;;
         *)… ;;
esac
Насколько проще…
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн jack_solovey

  • Автор темы
  • Активист
  • *
  • Сообщений: 853
  • Mate, и никаких Unity
    • Просмотр профиля
case $st in
*sql|*full) … ;;
         *)… ;;
esac
Насколько проще…
Соглашусь когда пойму.
Пока что не понятен синтаксис.

1. in это нахождение во множестве, так? тогда не понятно почему не  так (*sql*|*full*)
т.е. почему * только спереди буквосочетания и почему нет открывающей скобки?

2. Вот это вот не понял вообще никак
) … ;;
         *)… ;;

Оффлайн ALiEN175

  • Модератор форума
  • Старожил
  • *
  • Сообщений: 4307
  • Capture the truth
    • Просмотр профиля
1. in, закрывающая скобка и ;; - стандартная конструкция case. К выборке отношения не имеет.

Тык

(Нажмите, чтобы показать/скрыть)

2. опять же стандартная конструкция case
вместо троеточия-  набор действий

(Нажмите, чтобы показать/скрыть)
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Nvidia 8500GT :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

 

Страница сгенерирована за 0.176 секунд. Запросов: 25.