シェルスクリプトで処理を書いてみた

■書いた処理内容
hosts.allowというファイルを、バックアップを取ってマスターの内容に書き換える(初期化する)という処理です。ログファイルも作って、いつ、何の処理が始まってどうなったのか記録するようにしました。初めて作ったので、ばっちい書き方だと思いますが、よろしければ参考にしてやってください。


■注意事項
◎一行目の「#! /usr/bash」は、シェルで「which bash」とコマンドを打って出てきたパスに書き換えてください。
◎***********の部分は、絶対パスで各自の環境に合わせて指定してください。
◎「$?」は、$?の直前に実行したコマンドの終了ステータスを返してくれるbashスクリプトの特殊変数です。これが0だと、実行したコマンドは真(以下のスクリプトではコマンド実行の成功と同義)で、1のときは偽となります。cshの場合は、「$status」です。

#! /bin/bash

#hosts.allowのマスター、バックアップファイルの保存先、hosts.allowを指定
master=**************************
back=****************************
hosts_allow=***************************

#このスクリプトの実行ログの保存先を指定
log=*********************************


#日付の取得
date=`date +%y%d%m`

#バックアップファイルとログファイルを作成
LOG=$log/log_$date
BACK=$back/hosts.allow_$date


#hosts.allowのバックアップ
echo "hosts.allowのバックアップ開始:`date`" >> $LOG
cp $master $BACK

if [ $? -eq 0 ]; then
    echo "バックアップ完了:`date`" >> $LOG
else
    echo "バックアップ失敗:`date`" >> $LOG
fi


#hosts.allowの初期化
echo "hosts.allowの初期化開始:`date`" >> $LOG
cp $master $hosts_allow

if [ $? -eq 0 ]; then
    echo "初期化完了:`date`" >> $LOG
else
    echo "初期化失敗:`date`" >> $LOG
fi


echo "処理は正常に終了しました:`date`" >> $LOG

◎今回、最も悩んだ部分↓

if [ $? -eq 0 ]; then
    echo "バックアップ完了:`date`" >> $LOG
else
    echo "バックアップ失敗:`date`" >> $LOG
fi

ifの行で、「command not found」とエラーが出てしまい、なかなか解決策が分かりませんでした。このエラーが出てた理由は、

[ $? -eq 0 ]

の部分が、こう↓なっていたこと。

[$? -eq 0]

そう、半角スペースがなかったのです!これにたどり着くまでに、改行コードの確認をしてみたり、最終行にスペースが入っているか確認したり。。。長い道のりでした。


◎最大の学び
条件分岐を書くときは、条件式の初めと終わりに半角スペースがいりますよ〜。

[条件式] ではなくて、 [ 条件式 ] が正しい書き方です。

もうちょっと、エラー処理を追加したり、スマートに書き換えます。