Bash:用于比较文件路径的正则表达式

Bash:用于比较文件路径的正则表达式

我想检查输入字符串是否与白名单文件路径匹配,然后只有我想执行一些操作。

我正在做这样的事情

path1="mydir/**"
path2="mydir/testing"

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

如果路径像这样

mydir/test/dir
mydir/othertest/dir

这些应该会过去。

上面的检查给了我一个错误

assets/bin/copymain: line 8: [: too many arguments

答案1

请注意,如果唯一的要求是比较以某种方式结束或开始的路径/字符串,则不需要正则表达式:

d1=mydir/test/dir
d2=mydir/othertest/dir
d3=mydir-2/test/dir-2

[[ "$d1" == mydir/* ]] && echo matches
[[ "$d2" == mydir/* ]] && echo matches
[[ "$d3" != mydir/* ]] && echo no-match

[[ "$d1" == */dir ]] && echo matches
[[ "$d2" == */dir ]] && echo matches
[[ "$d3" != */dir ]] && echo no-match

答案2

path1="mydir/**"
path2="mydir/testing"

这里path1="mydir/**"使用的通配模式是一种与比较中使用的扩展正则表达式完全不同的语言。

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

但条件使用正则表达式:

[[ "$path2" =~ "$path1" ]]

[ [和之间不要添加空格,] ]但是[[]]

参数扩展通配符和正则表达式是两种不同的模式语言。

如果$path1包含白名单模式,那么您必须在正则表达式中这样编写:

path1='^mydir/'
path2="mydir/testing"

[[ ${path2} =~ ${path1} ]] && echo "Matches"

右侧是 RegEx 变量path1,不能用引号引起来,因为这会导致正则表达式运算符(如^上面)按字面意思理解(除非您设置了compat31option 或 set BASH_COMPAT=3.1)。

相关内容