我在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

这看起来有点笨拙。


当前回答

这个怎么样:

text="   <tag>bmnmn</tag>  "
if [[ "$text" =~ "<tag>" ]]; then
   echo "matched"
else
   echo "not matched"
fi

其他回答

使用jq:

string='My long string'
echo $string | jq -Rr 'select(contains("long"))|"It is there"'

jq中最困难的事情是打印单个引用:

echo $string | jq --arg quote "'" -Rr 'select(contains("long"))|"It\($quote)s there"'

仅使用jq检查条件:

if jq -Re 'select(contains("long"))|halt' <<< $string; then
    echo "It's there!"
fi

如果使用双括号,也可以在case语句外使用Marcus的答案(*通配符):

string='My long string'
if [[ $string == *"My long"* ]]; then
  echo "It's there!"
fi

注意,针字符串中的空格需要放在双引号之间,*通配符应该放在外面。还要注意,使用了简单的比较运算符(即==),而不是正则表达式运算符=~。

我不确定是否使用if语句,但您可以使用case语句获得类似的效果:

case "$string" in 
  *foo*)
    # Do stuff
    ;;
esac

我发现我经常需要这个功能,所以我在.bashrc中使用了一个自制的shell函数,这样我就可以随时重用它,并使用一个容易记住的名字:

function stringinstring()
{
    case "$2" in
       *"$1"*)
          return 0
       ;;
    esac
    return 1
}

要测试$string1(例如,abc)是否包含在$string2(例如,123abcABC)中,我只需要运行striginstring“$string1”“$string2”并检查返回值,例如

stringinstring "$str1" "$str2"  &&  echo YES  ||  echo NO

我喜欢sed。

substr="foo"
nonsub="$(echo "$string" | sed "s/$substr//")"
hassub=0 ; [ "$string" != "$nonsub" ] && hassub=1

编辑,逻辑:

使用sed从字符串中删除子字符串的实例如果新字符串与旧字符串不同,则存在子字符串