我正在使用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
答案 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