シェルスクリプトで、ファイル名から拡張子を判定する

あくまでも、ファイル名から拡張子を判断するだけ。

以下に、$filenameとして与えられたファイルが拡張子.gzを持つかどうかを確認するシェルスクリプトのサンプルを示す。

Caseを使うケース。
非常に素直。

       #!/bin/sh

       case "$filename" in
       *\.gz)
         echo "Found .gz suffix"
         ;;
       *)
         echo "Not a .gz suffix"
         ;;
       esac


basenameを使うケース。

       #!/bin/sh

       # `basename $filename .gz` returns `basename $filename`
       # *unless*  it has a .gz suffix.
       [ `basename $filename .gz` = `basename $filename` ] || {
               echo $filename has a .gz suffix
       }

そもそもbasenameは、与えられた文字列からディレクトリ名を削除し、ファイル名部分を抜き出すコマンド。
第二引数として拡張子を与えると、文字列からはその拡張子も削除される。
これを逆に利用している。

つまり、$filenameが.gzという拡張子をもって*いない*場合、`basename $filename .gz`の結果は、`basename $filename`と等しい。