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次のように書く必要があります。

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

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

右側にはpath1引用符で囲むことができないRegEx変数があります。これにより、上記の正規表現演算子が文字通り認識されます(optionまたはsetを^設定しない限り)。compat31BASH_COMPAT=3.1

関連情報