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)。

相關內容