それではスクリプトの解説に入ります。
まずは、今回題材としたスクリプトのおおざっぱな構造と処理の流れを解説します。
この題材スクリプトの仕様は以下の通りです。
スクリプトの全体は以下のようになっています。
#!/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