Что эквивалентно выражению python в bash:
if "mystr" in "a long string with mystring in it":
print("found string")
Смещение в число символов , нельзя полагаться на постоянной, так что я не думаю , что я могу cut
, чтобы работать.
Используйте сопоставление по шаблону. Специально для 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, но всегда с префиксом ^
). Поэтому будьте осторожны при передаче переменной в качестве совпадения.
Это сделает это:
#! /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.
Вы можете использовать расширение параметра bash
:
if [ "${TestString/$SearchString/}" == "$TestString" ]; then echo Found; fi
или если вы хотите Bourne-совместимое выражение:
if [ "${TestString#*$SearchString}" == "$TestString" ]; then echo Found; fi
$SearchString
может быть литералом: он может содержать пробелы, литерал или переменную, а переменная может содержать }
, но в литерале он должен быть экранирован как \}
. В первой форме то же самое относится и к /
.