在Bash中,是否可以将包含通配符的字符串变量与另一个字符串进行匹配



我正在尝试将字符串与从文件中读取的其他字符串列表进行比较。

但是,文件中的某些字符串包含通配符(包括?和*(,匹配时需要考虑这些通配符。

我可能错过了什么,但我不知道如何做到

例如。

我在一个数组中有来自文件的字符串,可以是任何字母数字(包括逗号和句号(和通配符:(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

最新更新