How to find substring inside a string (or how to grep a variable)?
本问题已经有最佳答案,请猛点这里访问。
我正在使用bash,不知道如何查找子字符串。它总是失败,我有一个字符串(这应该是一个数组吗?)
下面,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 |
我也试过,但不起作用:
1 | if [ `expr match"$LIST" '$SOURCE'` ]; then |
1 2 3 4 5 6 7 | 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 |
还可以与通配符进行比较:
如果你使用bash,你可以说
1 2 3 | if grep -q"$SOURCE" <<<"$LIST" ; then ... fi |
这在bash中工作,而不需要分叉外部命令:
1 2 3 | function has_substring() { [["$1" !="${2/$1/}" ]] } |
示例用法:
1 2 3 4 5 | name="hello/world" if has_substring"$name""/" then echo"Indeed, $name contains a slash!" fi |
1 | expr match"$LIST" '$SOURCE' |
不起作用,因为这个函数从字符串的开头搜索$source,并返回模式$source后面的位置(如果找到其他0)。因此,您必须编写另一个代码:
1 | expr match"$LIST" '.*'"$SOURCE" or expr"$LIST" : '.*'"$SOURCE" |
表达式$source必须双引号,以便解析器可以设置替换。单引号不能替代,上面的代码将从$list的开头搜索文本字符串$source。如果需要字符串的开头,请减去$source的长度,例如$source。你也可以写信
1 | expr"$LIST" :".*\($SOURCE\)" |
这个函数只是从$list中提取$source并返回它。否则会得到空字符串。但他们对双引号有问题。如果不使用附加变量,我不知道它是如何解决的。这是光溶液。所以你可以用c来写,这里有ready函数str。不要使用expr索引,所以非常有吸引力。但索引搜索不是子字符串,而是第一个字符。
如果只想查找单个字符,可以使用"index",例如:
1 2 3 4 5 6 7 8 | LIST="server1 server2 server3 server4 server5" SOURCE="3" if expr index"$LIST""$SOURCE"; then echo"match" exit -1 else echo"no match" fi |
输出为:
1 2 | 23 match |
嗯,像这样的事情怎么样:
1 2 3 4 5 | PS3="Select database or <Q> to quit:" select DB in db1 db2 db3; do ["${REPLY^*}" = 'Q' ] && break echo"Should backup $DB..." done |
使用expr而不是[而不是在其内部,并且变量仅在双引号内展开,因此请尝试以下操作:
1 | if expr match"$LIST""$SOURCE"; then |
但我不太清楚应该代表什么信息源。
看起来您的代码将从标准输入中以模式读取,如果它与数据库别名匹配,则退出,否则将返回"OK"。这就是你想要的吗?