ファイルやディレクトリをさまざまな形式で圧縮する

スクリプト名: squeeze.sh
書式: squeeze.sh 圧縮形式拡張子 ファイル ...
目的: ファイルやディレクトリをさまざまな形式に圧縮する
戻り値: すべて成功:0 一部失敗:1 エラー:9

#!/bin/sh
. Error_Msg.sh && . Arg_Nums.sh && . Chk_File.sh || exit 9
Arg_Nums -ge 2 "$@" || exit 9
Chk_File -dw "." || exit 9

_POSTFIX=$1; shift 1
_PWD=$PWD

for _FILE in "$@"; do
    _FLAG=

    #ファイルの読み込みチェック
    Chk_File -r "$_FILE" || Chk_File -drx "$_FILE" || \
    { Error_Msg "$0" "Could not read $_FILE."; _FLAG=failed; }

    #圧縮コマンドの決定とフラグ
    case $_POSTFIX in
        tar.gz  ) _COMMAND="tar zcf" ;;
        tar.bz  ) _COMMAND="tar jcf" ;;
        tar     ) _COMMAND="tar cf"  ;;
        lzh     ) _COMMAND="lha c"   ;;
        gz      ) _COMMAND="gzip" ;  _FLAG=over ;;
        bz2     ) _COMMAND="bzip2" ; _FLAG=over ;;
        zip     ) _COMMAND="zip -r"  ;;
        * ) Error_Msg "$0" "Unknown compression."
            _FLAG=failed ;;
    esac    

    #圧縮作業
    _FILENAME=$(basename "$_FILE")
    if [ "$_FLAG" = over ]; then
        $_COMMAND < "$_FILE" > "$_FILENAME.$_POSTFIX"
    elif [ "$_FLAG" = failed ]; then
        _RETURN=1
    else
        cd "$(dirname "$_FILE")"
        $_COMMAND "$_PWD/$_FILENAME.$_POSTFIX" "$_FILENAME" 1>/dev/null
        cd "$_PWD"
    fi  
done
exit $_RETURN