我正在尝试将字符串与从文件中读取的其他字符串列表进行比较。
但是,文件中的某些字符串包含通配符(包括?和*(,匹配时需要考虑这些通配符。
我可能错过了什么,但我不知道如何做到
例如。
我在一个数组中有来自文件的字符串,可以是任何字母数字(包括逗号和句号(和通配符:(a?cd,xy,q?hz,j,h-??(
我有另一个字符串,我希望依次与列表中的每个项目进行比较。任何字符串都可以包含空格。
所以我想要的是类似的东西
teststring="abcdx.rubb ish,y"
matchstrings=("a?cd" "*x*y" "q?h*z" "j*,h-??")
for i in "${matchstrings[@]}" ; do
if [[ "$i" == "$teststring" ]]; then # this test here is the problem
<do something>
else
<do something else>
fi
done
这应该与第二个";匹配字符串";但没有任何其他
感谢的任何帮助
是;您只需要反转==
的两个操作数;地球仪在右边(不得引用(:
if [[ $teststring == $i ]]; then
示例:
$ i=f*
$ [[ foo == $i ]] && echo pattern match
pattern match
如果引用参数展开,则操作将被视为文字字符串比较,而不是模式匹配。
$ [[ foo == "$i" ]] || echo "foo != f*"
foo != f*
图案中的空格不是问题:
$ i="foo b*"
$ [[ "foo bar" == $i ]] && echo pattern match
pattern match
您甚至可以在POSIX中完全做到这一点,因为case
备选方案需要进行参数替换:
#!/bin/sh
teststring="abcdx.rubbish,y"
while IFS= read -r matchstring; do
case $teststring in
($matchstring) echo "$matchstring";;
esac
done << "EOF"
a?cd
*x*y
q?h*z
j*,h-??
EOF
这根据需要仅输出*x*y
。