日付のループ処理のテンプレートです
環境: 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アクセスログを処理するのに使っています。
この記事は以上です。