【第2回】シェルスクリプトで学ぶ!Linuxコマンド
LPICの学習をしててふと思うこと…それは
「このコマンドって実際に使うのか?」
こんな疑問を(私自身が)解決すべく、LPICレベル1で学習するコマンドを使用して、使えそう(?)なシェルスクリプトを作成していきます。
コマンドも覚えられてシェルスクリプトも作成できるようになるなんて、まさに一石二鳥ですね!
今回は、おなじみのバックアップをとるスクリプトです。ただバックアップをとるだけではつまらないので、バックアップのとりかたに注目してみてください。
以下、スクリプトです。
#!/bin/bash
#####バックアップ用ディレクトリ作成#####
#バックアップをとるディレクトリを簡単に変更できるよう、変数にまとめる。
backuproot=”/tmp/$USER/backupdir”
#ログをとるディレクトリも
bklogroot=”~”
#バックアップディレクトリがない場合、作成。
if [ ! -d $backuproot ];
then
mkdir -p $backuproot
fi
##########################################
#####古いものをリネーム・最古のものを削除#####
#今回は、backup3までとっておくことにします。
if [ -f $backuproot/backup2.tar.gz ];
then
rm -f $backuproot/backup2.tar.gz
fi
if [ -f $backuproot/backup1.tar.gz ];
then
mv $backuproot/backup1.tar.gz $backuproot/backup2.tar.gz
fi
if [ -f $backuproot/backup.tar.gz ];
then
mv $backuproot/backup.tar.gz $backuproot/backup1.tar.gz
fi
##########################################
#####tarコマンドで圧縮してバックアップ#####
#大して解凍しないことを考えると、bz2とかでもいいかも
tar cfz $backuproot/backup.tar.gz -C ~ .
##########################################
#####成功・失敗をログファイルに残す#####
timelog=`date ‘+%Y%m%d’`
if [ $? = 0 ];
then
echo “$timelog —> バックアップ成功しました。” >> $bklogroot/backup.log
else
echo “バックアップ失敗しました。” >> $bklogroot/backup.log
fi
##########################################
コメントで書いた通り、バックアップをとるディレクトリ名称を変数でまとめることにより、変数内の値を変更するだけでディレクトリ変更が行えるようにしました。
また、バックアップのファイルは圧縮しているとはいえ、サイズが大きくなりがちです。リネームをしてローテーションさせることにより、バックアップファイルによる容量の肥大化を防いでいます。
※実際には、ここにももう一工夫して、残すバックアップファイル数を簡単に変更できるようにしたほうが良かったかも。
あとはログファイルですね。ログファイルを残すことにより、今回のような比較的深い階層にとってあるバックアップディレクトリをいちいち見に行く必要がなくなります。
使用したコマンド
mkdir
ディレクトリの作成を行います。今回の使い方では、-pオプションを使用することにより、階層を一気に作成しています。-pオプションなしでは親ディレクトリが存在しない場合、子ディレクトリも作成ができません。
rm
ファイルやディレクトリの削除を行なうコマンドです。-fオプションを使用することにより、yes/noの問い合わせなしに削除を行なっています。
mv
ファイルやディレクトリの移動、名前の変更を行うコマンドです。今回は移動ではなく、名前の変更を行うために使用しています。同一ディレクトリ内での移動で名前の変更を行うことができます。
tar
tar形式のアーカイブファイルに対しての操作を行うコマンドです。今回は、gzip形式で圧縮したtarアーカイブとしてバックアップファイルを作成しています。(オプションcでアーカイブファイルの作成、fでファイル名の指定、zでgzip形式で圧縮)
date
システムクロックの時刻を表示するコマンド。今回は、必要な情報だけを取り出すために、”+%Y%m%d”を使用しています。
こうすることで、タイムスタンプ形式で現在時刻の表示が行えます。
echo
引数を標準出力するコマンド。変数内の値を出力するには”$変数名”とします。