読者です 読者をやめる 読者になる 読者になる

Yura YuLife

ITエンジニアの覚え書き

シェルスクリプトで日付が有効かをチェックし、開始・終了日間でループする

シェルスクリプトで、特定の日付間のログのみを抽出する等の処理をする際に、日付でループするコードの例です。

サンプルコード

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]

参考URL