【发布时间】:2013-05-12 06:05:08
【问题描述】:
我在 bash 中有以下字符串
str1="any string"
str2="any"
我想检查str2是否是str1的子串
我可以这样做:
c=`echo $str1 | grep $str2`
if [ $c != "" ]; then
...
fi
有没有更有效的方法?
【问题讨论】:
我在 bash 中有以下字符串
str1="any string"
str2="any"
我想检查str2是否是str1的子串
我可以这样做:
c=`echo $str1 | grep $str2`
if [ $c != "" ]; then
...
fi
有没有更有效的方法?
【问题讨论】:
您可以使用通配符扩展*。
str1="any string"
str2="any"
if [[ "$str1" == *"$str2"* ]]
then
echo "str2 found in str1"
fi
请注意,* 扩展不适用于单个 [ ]。
【讨论】:
[[]] 相对于[] 的主要优势之一是不需要引用...
您可以使用 bash 正则表达式匹配而不使用 grep:
if [[ $str1 =~ $str2 ]]; then
...
fi
请注意,正则表达式模式不需要任何周围的斜杠或引号。如果你想使用 glob 模式匹配,只需使用 == 而不是 =~ 作为运算符。
一些例子可以在here找到。
【讨论】:
str1="any string"
str2="any"
老派(Bourne shell 风格):
case "$str1" in *$str2*)
echo found it
esac
新学校(如演讲者所示),但请注意右侧的字符串将被视为正则表达式:
if [[ $str1 =~ $str2 ]] ; then
echo found it
fi
但这也可以,即使您并不完全期待它:
str2='.*[trs].*'
if [[ $str1 =~ $str2 ]] ; then
echo found it
fi
使用grep 很慢,因为它会产生一个单独的进程。
【讨论】:
case 表达式。但这不是老派,它是当前最先进的,因为它具有 POSIXly 便携性。顺便说一句,无需引用 $str1;在case 之后没有进行分词。
case 查找子字符串的方式适用于任何 Bourne shell,因此是最先进的,并且是无条件首选的。任何使用像 [[ ]] 这样的 bashism 的人都需要学习可移植性课程。 :-)
if echo $str1 | grep -q $str2 #any command
then
.....
fi
【讨论】: