Bash:マッチングを実行する引数拡張の文脈における「パターンマッチング」と「ファイル名拡張子」の違い

Bash:マッチングを実行する引数拡張の文脈における「パターンマッチング」と「ファイル名拡張子」の違い

編集する:Gordon Davidsonからのコメント この質問に対する回答です。

私は、GNU Bashのマニュアルを読んで、パターンマッチングに使用できる基本的に3つのタイプの「パラメータ拡張」があることを発見しました。

  1. ${parameter#word} ${parameter##word}
  2. ${parameter%word} ${parameter%%word}
  3. ${parameter/pattern/string} ${parameter//pattern/string} ${parameter/#pattern/string} ${parameter/%pattern/string}

最初の2つを次のように説明するのは奇妙だと思います。

単語が展開され、パターンが生成され、以下の規則に従って一致します(パターン一致を参照)。

ただし、3番目は次のように説明されています。

ファイル名拡張と同様に、パターンを拡張してパターンを生成します。 [...] 一致は、以下の規則に従って実行されます(パターン一致を参照)。

拡張子の間に実際に違いがあるかどうか疑問に思います。最初の2つの説明では、どのような拡張が行われるかは完全には明確ではありませんが、それに関係なく、「パターン一致」ルールは実際には「ファイル名拡張」と同じです。

それでは、文書が十分にはっきりしていないので、問題である可能性があり、すべて同じであると言えるでしょうか?

私の考えでは、最初の2つの説明がより正確であるようです。 3番目の説明では、実際のファイルシステムチェックが実行されているかどうか疑わしいからです。

答え1

a*kパターンマッチングとは、パターンマッチングという概念を指しますaardvark

ファイル名拡張子使用パターンマッチング。ファイルシステムからディレクトリエントリを検索し、指定されたパターンに一致する名前を収集します。

シェルでは、パターンマッチングは単純なファイル名拡張を超える目的で使用されます。たとえば、Case 文では次のようになります。

case $file in
  *.jpg ) do something with jpg file 
          ;;
  *.gif ) do something with gif file
          ;;
  * ) fallback case
      ;;
esac

globfnmatchPOSIXは、それぞれファイル名拡張とパターンマッチングを実行するという2つのCライブラリ関数を定義します。それらの間にはいくつかの違いがあります。 (シェル実装は必ずしもこれらの関数を使用するわけではありませんが、独自のパターンマッチングとファイル拡張を実装します。)

関連情報