如何find一个string中的子string(或如何grep一个variables)?

我正在使用BASH,我不知道如何find一个子string。 它保持失败,我有一个string(应该是一个数组?)

下面, LIST是数据库名称的string列表, 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 

Solutions Collecting From Web of "如何find一个string中的子string(或如何grep一个variables)?"

 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 

你也可以比较通配符:

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

如果你使用bash,你可以说

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

这在Bash中工作,而不分叉外部命令:

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

用法示例:

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

如果您只想查找单个字符,则可以使用“索引”,例如:

 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 
 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索引,所以非常有吸引力。 但索引搜索不是子字符串,只有第一个字符。

expr被用来代替 [而不是在里面,而变量只在双引号内被扩展,所以试试这个:

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

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

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

那么,这样的事情呢?

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