如何在字符串中找到子字符串(或如何grep变量)?

时间:2010-12-17 04:38:36

标签: linux string bash db2

我正在使用BASH,我不知道如何找到子字符串。它一直失败,我有一个字符串(这应该是一个数组?)

下面,LIST是数据库名称的字符串列表,SOURCE是回复,其中一个是数据库。以下仍然不起作用:

echo "******************************************************************"
echo "*                  DB2 Offline Backup Script                     *"
echo "******************************************************************"
echo "What's the name of of the  database you would like to backup?"
echo "It will be named one in this list:"
echo ""
LIST=`db2 list database directory | grep "Database alias" | awk '{print $4}'`
echo $LIST
echo ""
echo "******************************************************************"
echo -n ">>> "
read -e SOURCE

if expr match "$LIST" "$SOURCE"; then
    echo "match"
    exit -1
else
    echo "no match"
fi
exit -1

我也尝试了这个但不起作用:

if [ `expr match "$LIST" '$SOURCE'` ]; then

8 个答案:

答案 0 :(得分:47)

LIST="some string with a substring you want to match"
SOURCE="substring"
if echo "$LIST" | grep -q "$SOURCE"; then
  echo "matched";
else
  echo "no match";
fi

答案 1 :(得分:27)

您还可以与通配符进行比较:

if [[ "$LIST" == *"$SOURCE"* ]]

答案 2 :(得分:7)

如果你正在使用bash,你可以说

if grep -q "$SOURCE" <<< "$LIST" ; then
    ...
fi

答案 3 :(得分:5)

这适用于Bash而不需要外部命令:

function has_substring() {
   [[ "$1" != "${2/$1/}" ]]
}

使用示例:

name="hello/world"
if has_substring "$name" "/"
then
   echo "Indeed, $name contains a slash!"
fi

答案 4 :(得分:1)

如果您只想找到一个字符,可以使用“index”,例如:

LIST="server1 server2 server3 server4 server5"
SOURCE="3"
if expr index "$LIST" "$SOURCE"; then
    echo "match"
    exit -1
else
    echo "no match"
fi

输出是:

23
match

答案 5 :(得分:1)

expr match "$LIST" '$SOURCE'

因为这个函数没有工作从字符串的开头搜索$ SOURCE并返回模式$ SOURCE之后的位置,如果找到其他0.所以你必须写另一个代码:

expr match "$LIST" '.*'"$SOURCE" or expr "$LIST" : '.*'"$SOURCE"

表达式$ SOURCE必须加双引号,以便解析器可以设置替换。单引号不能替换,上面的代码将从$ LIST的开头搜索文本字符串$ SOURCE。如果你需要字符串的开头减去长度$ SOURCE例如$ {#SOURCE}。 你也可以写

expr "$LIST" : ".*\($SOURCE\)"

此函数只从$ LIST中提取$ SOURCE并返回它。你会得到空字符串。但他们的问题是双重双引号。我不知道如何在不使用额外变量的情况下解决问题。 这是轻松的解决方案。所以你可以用C语言编写。有准备好的函数strstr。 不要使用expr索引,所以非常有吸引力。但索引搜索不是子字符串而只是第一个字符。

答案 6 :(得分:0)

expr使用而不是 [而不是在其中,变量只在双引号内扩展,所以试试这个:

if expr match "$LIST" "$SOURCE"; then

但我并不清楚SOURCE应该代表什么。

看起来您的代码将从标准输入读取模式,如果它与数据库别名匹配则退出,否则它将回显“ok”。这就是你想要的吗?

答案 7 :(得分:0)

嗯,这样的事情怎么样:

PS3="Select database or <Q> to quit: "
select DB in db1 db2 db3; do
   [ "${REPLY^*}" = 'Q' ] && break
   echo "Should backup $DB..."
done