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" ]]

[ [との間にスペースを入れないでください] ][[]]

パラメータ拡張グロビングと正規表現は、2 つの異なるパターン言語です。

$path1ホワイトリスト パターンが含まれている場合は、次のように RegEx で記述する必要があります。

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

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

右側は RegEx 変数でありpath1、引用符で囲んではなりません。引用符で囲むと、正規表現演算子 (^上記など) が文字通り解釈されてしまいます (compat31オプションを設定するか、 を設定しない限りBASH_COMPAT=3.1)。

関連情報