Что эквивалентно выражению python в bash:

if "mystr" in "a long string with mystring in it":
    print("found string")

Смещение в число символов , нельзя полагаться на постоянной, так что я не думаю , что я могу cut , чтобы работать.

3 ответа3

2

Используйте сопоставление по шаблону. Специально для bash:

if [[ $longstring == *mystr* ]]; then

if [[ $longstring == *"my string"* ]]; then

if [[ $longstring == *"$matchstr"* ]]; then

В операторе [[ левая сторона раскрывается буквально (то есть без необходимости ставить двойные кавычки), тогда как части правой части без кавычек обрабатываются как символы подстановки - в основном те же правила цитирования, что и в операторе case ,

Также можно использовать регулярное выражение POSIX:

if [[ $longstring =~ mystr ]]; then

if [[ $longstring =~ "my string" ]]; then

if [[ $longstring =~ "$matchstr" ]]; then

Опять же, цитируемые части правой части сопоставляются буквально, а не заключенные в кавычки части сопоставляются как операторы регулярных выражений.


Если вам требуется совместимость с sh :

case $longstring in
    *mystr*)
        echo yes;;
    *"$matchstr"*)
        echo yes again!;;
    *)
        echo no;;
esac

В качестве альтернативы, если вы хотите злоупотреблять языком:

if case $longstring in
    *mystr*) true;;
    *"$matchstr"*) true;;
    *) false;;
esac; then
    ...
fi

(Эта форма if/case/esac/then полезна в некоторых ситуациях, например, при создании добавочного белого / черного списка.)

Более короткая версия:

if ! case $longstring in *"$matchstr"*) !; esac; then
    echo "It matched!"
fi

Многие скрипты sh используют expr но это не встроенная оболочка, поэтому немного медленнее:

if expr match "$longstring" ".*mystr"; then
    ...
fi

В этом случае (поскольку expr не видит различий в кавычках) весь параметр "match" интерпретируется как привязанное регулярное выражение (например, grep, но всегда с префиксом ^ ). Поэтому будьте осторожны при передаче переменной в качестве совпадения.

1

Это сделает это:

#! /bin/bash

X=`echo "a long string with mystring in it" | grep "mystr" | wc -l`
if [ $X -gt 0 ]
then
        echo "found string";
fi

Идея состоит в том, что "echo" устанавливает строку, grep ищет подстроку в переданной ей строке, а wc -l возвращает количество строк, в которых была найдена строка - так что либо 0, либо 1.

0

Вы можете использовать расширение параметра bash :

if [ "${TestString/$SearchString/}" == "$TestString" ]; then echo Found; fi

или если вы хотите Bourne-совместимое выражение:

if [ "${TestString#*$SearchString}" == "$TestString" ]; then echo Found; fi

$SearchString может быть литералом: он может содержать пробелы, литерал или переменную, а переменная может содержать } , но в литерале он должен быть экранирован как \} . В первой форме то же самое относится и к / .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .