我想知道如何在shell脚本中进行普通子字符串匹配。
例如,如果我有
STRING1="http://127.0.0.1/"
STRING2="http://127101011/"
SUBSTRING="127.0.0.1"
我希望SUBSTRING匹配STRING1但不匹配STRING2。它就像java.lang.String.indexOf(String)。
我想这个问题也可以通过正确转义SUBSTRING的内容来修复,但我似乎无法弄清楚如何。
谢谢你, wbkang
答案 0 :(得分:4)
STRING1="http://127.0.0.1/"
STRING2="http://127101011/"
SUBSTRING="127.0.0.1"
for string in "$STRING1" "$STRING2"
do
case "$string" in
(*$SUBSTRING*) echo "$string matches";;
(*) echo "$string does not match";;
esac
done
(*)
中的“case
”符号适用于Korn shell和Bash;它不适用于原始的Bourne shell - 不需要引导'(
'。
或者,可以使用expr
命令 - 这是另一个经典(和POSIX)命令,可能会被更现代的shell中的某些功能淘汰。
答案 1 :(得分:3)
你可以在这里找到一个脚本:
http://www.etalabs.net/sh_tricks.html
fnmatch () { case "$2" in $1) return 0 ;; *) return 1 ;; esac ; }
或者,效率稍高的版本可能是:
fnmatch () { case "$2" in $1) return 0 ;; esac ; return 1 ; }
然后将其用作:
if fnmatch "$SUBSTRING" "$STRING1" ; then ...
请注意,根据*
/ ?
模式规则(非正则表达式),[]
,glob
和括号fnmatch
将被视为特殊。< / p>
答案 2 :(得分:0)
#!/bin/bash
function is_matching() {
if [[ `echo "$1" | grep "$2"` != "" ]]; then return 1; fi
return 0;
}
is_matching "abcd" "bc"
echo $?
is_matching "abcd" "XX"
echo $?
运行该脚本:
$ ./test
1
0
如果您想在不使用grep的情况下执行此操作,请阅读此链接 - &gt; bash string manipulation