"${foo##*.}"構文はファイル拡張子をどのように取得しますか? [コピー]

"${foo##*.}"構文はファイル拡張子をどのように取得しますか? [コピー]

このコマンドがファイル拡張子を正常に検索するのはなぜですか?

file_ext=${filename##*.}

答え1

これはPOSIX シェルコマンド言語:

${parameter##word}

最大プレフィックスパターンを削除します。パターンを生成するには、単語を拡張する必要があります。次に、パラメータ拡張によって、プレフィックスの最大部分が削除されたパターンと一致するパラメータを生成する必要があります。

この特別な場合は、(すべての項目と一致)*.で終わる最大の部分文字列に展開され、最大の部分文字列が削除されます。そのため、ファイル拡張子だけが残ります。.*

ファイル名に含まれる内容がないと何も削除されませんので、.スクリプトで使用する際は注意してください。動作が予期したものと異なる場合があります。

答え2

見てくださいman bash(または使用しているシェルは何でも):

   ${parameter##word}
          Remove matching prefix pattern.  The word is expanded to produce
          a pattern just as in pathname expansion.  If the pattern matches
          the  beginning of the value of parameter, then the result of the
          expansion is the expanded value of parameter with  the  shortest
          matching  pattern  (the ``#'' case) or the longest matching pat‐
          tern (the ``##'' case) deleted.  If parameter is  @  or  *,  the
          pattern  removal operation is applied to each positional parame‐
          ter in turn, and the expansion is the resultant list.  If param‐
          eter  is  an array variable subscripted with @ or *, the pattern
          removal operation is applied to each  member  of  the  array  in
          turn, and the expansion is the resultant list.

したがって、あなたのケースでは、最後の「。」以前の項目はすべて削除されます。ファイルの拡張子となる残りの文字列を返します。

関連情報