シェルスクリプトで日付が有効かをチェックし、開始・終了日間でループする
シェルスクリプトで、特定の日付間のログのみを抽出する等の処理をする際に、日付でループするコードの例です。
サンプルコード
loop_date.sh
#!/bin/bash # 有効な日付ではない場合は終了する関数 function check_date() { date -d "$1" || exit 1 return 0 } # 引数の数をチェック if [ $# -ne 2 ]; then echo "使い方: ./loop_date.sh 開始日[YYYYMMDD] 終了日[YYYYMMDD]" exit 1 fi # 日付が有効かをチェック check_date $1 check_date $2 # 開始日 < 終了日になっているかをチェック if [ $1 -gt $2 ]; then echo "開始日は終了日よりも前にしてください" exit 1 fi BEGIN=$1 END=$2 CURRENT=$BEGIN # 開始日〜終了日までループ while true; do # ここに日付毎の処理を書く echo "処理: $CURRENT" if [ "$CURRENT" = "$END" ] then break fi # 日付を1日インクリメント CURRENT=$(date -d "$CURRENT 1day" "+%Y%m%d") done
動作例
$ ./loop_date.sh 20151201 20151205 2015年 12月 1日 火曜日 00:00:00 JST 2015年 12月 5日 土曜日 00:00:00 JST 処理: 20151201 処理: 20151202 処理: 20151203 処理: 20151204 処理: 20151205 $ ./loop_date.sh 20151130 20151201 2015年 11月 30日 月曜日 00:00:00 JST 2015年 12月 1日 火曜日 00:00:00 JST 処理: 20151130 処理: 20151201 $ ./loop_date.sh 20151131 20151205 date: `20151131' は無効な日付です $ ./loop_date.sh 20151205 20151201 2015年 12月 5日 土曜日 00:00:00 JST 2015年 12月 1日 火曜日 00:00:00 JST 開始日は終了日よりも前にしてください $ ./loop_date.sh 使い方: ./date_loop.sh 開始日[YYYYMMDD] 終了日[YYYYMMDD]