我在Bash中有一个字符串:

string="My string"

如何测试它是否包含另一个字符串?

if [ $string ?? 'foo' ]; then
  echo "It's there!"
fi

哪里是我不认识的接线员。我使用echo和grep吗?

if echo "$string" | grep 'foo'; then
  echo "It's there!"
fi

这看起来有点笨拙。


当前回答

公认的答案是正确的,但很难阅读和理解。对于与搜索相关的问题,应始终使用$needle in a$haystack习语。由于建议的编辑队列已满,我发布了以下内容:

haystack='There are needles here.'
if [[ "$haystack" == *"needle"* ]]; then
    echo "It's there!"
fi

其他回答

公认的答案是正确的,但很难阅读和理解。对于与搜索相关的问题,应始终使用$needle in a$haystack习语。由于建议的编辑队列已满,我发布了以下内容:

haystack='There are needles here.'
if [[ "$haystack" == *"needle"* ]]; then
    echo "It's there!"
fi

由于POSIX/BusyBox问题在没有提供正确答案(IMHO)的情况下结束,我将在这里发布答案。

最简单的答案是:

[ ${_string_##*$_substring_*} ] || echo Substring found!

or

[ "${_string_##*$_substring_*}" ] || echo 'Substring found!'

注意,对于某些shell(ash),双哈希是必须的。当未找到子字符串时,上面将计算[stringvalue]。它不会返回错误。找到子字符串时,结果为空,其结果为[]。这将抛出错误代码1,因为字符串被完全替换(由于*)。

最短最常见的语法:

[ -z "${_string_##*$_substring_*}" ] && echo 'Substring found!'

or

[ -n "${_string_##*$_substring_*}" ] || echo 'Substring found!'

另一个:

[ "${_string_##$_substring_}" != "$_string_" ] && echo 'Substring found!'

or

[ "${_string_##$_substring_}" = "$_string_" ] || echo 'Substring found!'

注意单个等号!

试试oobash。

它是Bash 4的OO风格字符串库。它支持德语元音变音。它是用巴什语写的。

有许多函数可用:-base64Decode、-base64Encode、-acapital、-center、-charAt、concat、-concontains、-count、-endsWith、-equals、-equalsIgnoreCase、-reverse、-hashCode、-indexOf、-isAlnum、-isAlpha、-isAscii、-isDigit、-isEmpty、-isHexDigit、-isLowerCase、-isSpace、-isPrintable、-isUpperCase、-isVisible、-lastIndexOf、-length、-matches、-replaceAll、-replaceFirst、-startsWith,-substring、-swapCase、-toLowerCase、-toString、-toUpperCase、-trim和-zfill。

查看包含的示例:

[Desktop]$ String a testXccc
[Desktop]$ a.contains tX
true
[Desktop]$ a.contains XtX
false

oobash可在Sourceforge.net上获得。

一个是:

[ $(expr $mystring : ".*${search}.*") -ne 0 ] && echo 'yes' ||  echo 'no'
case $string in (*foo*)
  # Do stuff
esac

这与https://stackoverflow.com/a/229585/11267590.但风格简单,也符合POSIX。