シェルスクリプトで処理を書いてみた
■書いた処理内容
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]
そう、半角スペースがなかったのです!これにたどり着くまでに、改行コードの確認をしてみたり、最終行にスペースが入っているか確認したり。。。長い道のりでした。
◎最大の学び
条件分岐を書くときは、条件式の初めと終わりに半角スペースがいりますよ〜。
[条件式] ではなくて、 [ 条件式 ] が正しい書き方です。
もうちょっと、エラー処理を追加したり、スマートに書き換えます。