LoginSignup
0
0

More than 1 year has passed since last update.

シェルスクリプトで日付のループ処理

Last updated at Posted at 2022-08-16

日付のループ処理のテンプレートです
環境: centos, bash

なにをするスクリプトか

このスクリプト.sh $開始日付 $終了日付

と叩くと開始日~終了日まで日付の範囲を echo します。

使用例
$ ./date_range_loop.sh 20220729 20220803
20220729
20220730
20220731
20220801
20220802
20220803
Done!

date_range_loop.sh コード内の次の部分は、任意の処理に書き変えて使います。

    # 何かの処理
    echo ${YYYYMMDD}

■ おすすめポイント
誰が使っても安全で、かつシンプルなコードを心がけました。
・不正な日付が渡されると即時終了します。
・問題なければループ処理します。

date_range_loop.sh
#!/bin/bash
STARTDATE=$1
ENDDATE=$2
TIMEDELTA="1 days"

#バリデーション
if [[ $# -ne 2 ]] ; then
    # How to use.
    echo "sh date_range_loop.sh \$STARTDATE \$ENDDATE"
    exit 1
fi
#書式は日付か
date -d "${STARTDATE}" "+%Y%m%d" > /dev/null  2>&1
is_valid=$?
if [ ${is_valid} -ne 0 ]; then
    echo "STARTDATE Error: Invaild date format -> ${STARTDATE}"
    exit 1
fi
date -d "${ENDDATE}" "+%Y%m%d" > /dev/null  2>&1
is_valid=$?
if [ ${is_valid} -ne 0 ]; then
    echo "ENDDATE Error: Invaild date format -> ${ENDDATE}"
    exit 1
fi
#日付範囲は適切か
if [[ ${STARTDATE} -ge $(date "+%Y%m%d") ]]; then
    echo "STARTDATE Error: Today or future day does not allowed -> ${STARTDATE}"
    exit 1
fi
if [[ ${ENDDATE} -ge $(date "+%Y%m%d") ]]; then
    echo "ENDDATE Error: Today or future day does not allowed  -> ${ENDDATE}"
    exit 1
fi
if [[ ${STARTDATE} -gt ${ENDDATE} ]]; then
    TIMEDELTA="1 days ago"
fi

YYYYMMDD=${STARTDATE}
while true; do
    # 何かの処理
    echo ${YYYYMMDD}

    # ENDDATE分まで処理したら終わり
    if [ ${YYYYMMDD} = ${ENDDATE} ]; then
        break
    fi

    # 日付をインクリメント
    YYYYMMDD=$(date -d "${YYYYMMDD} ${TIMEDELTA}" "+%Y%m%d")
done

echo "Done!"
exit 0

筆者は過去のwebアクセスログを処理するのに使っています。
この記事は以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0