文字列$string
がglobパターンと一致するかどうかを確認したいと思います$pattern
。 $string
既存のファイルの名前である場合とそうでない場合があります。これどうやってするの?
入力文字列について次の形式を想定します。
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
私はかどうかを判断し、bashのイディオム検索したい$string
にマッチしたことになる$pattern1
、$pattern2
または他の任意のglobパターンを。ここに私がこれまで試したものがあります:
[[ "$string" = $pattern ]]
これはほとんど機能
$pattern
しますが、グロブパターンではなく文字列パターンとして解釈されます。[ "$string" = $pattern ]
このアプローチの問題は、
$pattern
展開されてから文字列比較が実行され$string
、の展開であるということ$pattern
です。[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]
これ
$string
は機能しますが、存在するファイルが含まれている場合のみです。[[ $string =~ $pattern ]]
=~
演算子が$pattern
グロブまたはワイルドカードパターンではなく、拡張正規表現として解釈されるため、これは機能しません。
ls /foo/*
あなたが一致することができ、今
foo/{bar,baz}
実際には(パラメータ展開ではなく)ブレース展開であり、foo/*
パス名展開であることがわかりました。 $string
パラメータ展開です。これらはすべて、異なる時間に、異なるメカニズムで行われます。
case
ステートメントはBashマニュアルに従ってPathname Expansion( "globbing")を実行します。
{bar,baz}
は、パターンではないということです。パラメーターの拡張です。その中に微妙だが、重要な違いは、{bar,baz}
複数の引数に非常に早い段階で拡大し、されるbar
とbaz
。