入力文字列が許可されたファイルパスと一致していることを確認してから、いくつかの操作しか実行したいと思います。
私はこのようなことをしています
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を^
設定しない限り)。compat31
BASH_COMPAT=3.1