Совместимый ответ
Поскольку уже есть много ответов, использующих специфичные для Bash функции, есть способ работать с более бедными оболочками, такими как busybox :
[ -z "${string##*$reqsubstr*}" ]
На практике это может дать:
string='echo "My string"'
for reqsubstr in 'o "M' 'alt' 'str';do
if [ -z "${string##*$reqsubstr*}" ] ;then
echo "String '$string' contain substring: '$reqsubstr'."
else
echo "String '$string' don't contain substring: '$reqsubstr'."
fi
done
Это было проверено в bash , dash , ksh и ash (busybox), и результат всегда:
String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.
В одну функцию
В ответ на вопрос @EeroAaltonen есть версия того же демо, протестированная под теми же оболочками:
myfunc() {
reqsubstr="$1"
shift
string="$@"
if [ -z "${string##*$reqsubstr*}" ] ;then
echo "String '$string' contain substring: '$reqsubstr'.";
else
echo "String '$string' don't contain substring: '$reqsubstr'."
fi
}
Тогда:
$ myfunc 'o "M' 'echo "My String"'
String 'echo "My String"' contain substring 'o "M'.
$ myfunc 'alt' 'echo "My String"'
String 'echo "My String"' don't contain substring 'alt'.
Примечание: Вы должны экранировать или заключить в двойные кавычки и / или двойные кавычки:
$ myfunc 'o "M' echo "My String"
String 'echo My String' don't contain substring: 'o "M'.
$ myfunc 'o "M' echo \"My String\"
String 'echo "My String"' contain substring: 'o "M'.
Простая функция
Это было проверено в busybox , dash и, конечно, bash :
stringContain() { [ -z "${2##*$1*}" ]; }
Вот и все, ребята!
Тогда сейчас:
$ if stringContain 'o "M3' 'echo "My String"';then echo yes;else echo no;fi
no
$ if stringContain 'o "M' 'echo "My String"';then echo yes;else echo no;fi
yes
... Или, если отправленная строка может быть пустой, как указано @Sjlver, функция станет:
stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }
или в соответствии с предложением комментария Адриана Гюнтера , избегая переключения -o
:
stringContain() { [ -z "${2##*$1*}" ] && { [ -z "$1" ] || [ -n "$2" ] ;} ; }
С пустыми строками:
$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no