このエントリーをはてなブックマークに追加

それではスクリプトの解説に入ります。

まずは、今回題材としたスクリプトのおおざっぱな構造と処理の流れを解説します。

処理内容

この題材スクリプトの仕様は以下の通りです。

  • 第1引数に指定したファイルをバックアップする。
  • 第1引数に指定したファイルを第2引数に指定したファイル名でtar zcfで圧縮します。
  • 第2引数が存在しない場合はスクリプトで日付+時刻ベースのファイル名を勝手に付与します。
  • 引数指定が不正な場合は使用方法を表示して終了します。
  • 圧縮した結果のファイルが既に存在した場合は、処理を停止します。

コードの概要

スクリプトの全体は以下のようになっています。

#!/bin/bash

function usage() {
    message=`cat <<EOF

About this script:
    Backup script for files
Usage:
    ${0} targent_file_name [backup_file_name]
    target_file_name : file to backup
    backup_file_name : backup file name
                       default file_name is date and time based file_name
                       yyyymmddhhmmss.tgz like 20140101000000.tgz
EOF
`
    echo "${message}"
    return 0
}

function die() {
    if [ $# -eq 1 ] ; then
        echo "ERROR : ${1}"
    else
        echo "ERROR : unknow error"
    fi
    usage
    exit 1
}

if [ $# -lt 1 ]; then
    die "missing target file name"
fi

if [ -e $1 ]; then
    target_file_name=$1
else
    die "target file ${1} that you specified does not exists."
fi

if [ $2 ]; then
    if [ -e $2 ]; then
        die "backup file ${2} already exists"
    else
        backup_file_name=$2
    fi
else
    backup_file_name=`date +%Y%m%d%H%M%S`.tgz
fi

echo -n "backup ${target_file_name} to ${backup_file_name} ? [yes/no] : "
while read confirmation; do
    case $confirmation in
        'yes' ) tar zcf ${backup_file_name} ${target_file_name}
            break ;;
        'no' ) echo "stopped operation"
            exit 0 ;;
        *) echo "unknown option. try again."
            echo -n "backup ${target_file_name} to ${backup_file_name} ? [yes/no] : " ;;
    esac
done

if [ $? -eq 0 ] ; then
    exit 0
else
    exit 1
fi

まず、スクリプトの先頭にある"#!"で始まる行のことをshebang lineといいます。 このスクリプトが/bin/bashというプログラムで実行されることの宣言です。 このshebang lineを解析してコンピュータはこのスクリプトを/bin/bashで実行する必要があることを理解します。

#!/bin/bash

次に以下の部分は、関数宣言です。関数とはプログラム上から何度も呼ばれたりする処理をまとめて関数にしたものです。

function usage() {
    message=`cat <<EOF

About this script:
    Backup script for files
Usage:
    ${0} targent_file_name [backup_file_name]
    target_file_name : file to backup
    backup_file_name : backup file name
                       default file_name is date and time based file_name
                       yyyymmddhhmmss.tgz like 20140101000000.tgz
EOF
`
    echo "${message}"
    return 0
}

function die() {
    if [ $# -eq 1 ] ; then
        echo "ERROR : ${1}"
    else
        echo "ERROR : unknow error"
    fi
    usage
    exit 1
}

以下の部分はシェルスクリプト実行時の引数のチェックと内部で使用する変数の準備です。 ここでは変数と特殊変数、if文による条件分岐について説明します。

if [ $# -lt 1 ]; then
    die "missing target file name"
fi

if [ -e $1 ]; then
    target_file_name=$1
else
    die "target file ${1} that you specified does not exists."
fi

if [ $2 ]; then
    if [ -e $2 ]; then
        die "backup file ${2} already exists"
    else
        backup_file_name=$2
    fi
else
    backup_file_name=`date +%Y%m%d%H%M%S`.tgz
fi

以下の部分は、スクリプトの中心となる処理を実行する部分です。 ここでは、ループとcaseを使った条件分岐について説明します。 また、ユーザの確認入力を待つ方法についても解説します。

echo -n "backup ${target_file_name} to ${backup_file_name} ? [yes/no] : "
while read confirmation; do
    case $confirmation in
        'yes' ) tar zcf ${backup_file_name} ${target_file_name}
            break ;;
        'no' ) echo "stopped operation"
            exit 0 ;;
        *) echo "unknown option. try again."
            echo -n "backup ${target_file_name} to ${backup_file_name} ? [yes/no] : " ;;
    esac
done

最後に終了時の処理です。ここは習慣的なものでもあり、なくてもプログラムは動作しますが、 このシェルスクリプトを他のシェルプログラムが利用するときに重要な終了ステータスを明示的に反して終了しています。

if [ $? -eq 0 ] ; then
    exit 0
else
    exit 1
fi



記事一覧へ