shellで日付で繰り返し処理をする方法

こんにちは、さるまりんです。

日次の処理をある日から別のある日まで1日ずつ繰り返し実行することって結構あると思います。以下はその日付の文字列を作るシェルスクリプトです。

run-for-days.sh

#!/bin/sh

BEGIN=20210226
END=`date '+%Y%m%d'`

echo run from $BEGIN to $END

CUR=$BEGIN

while [ 1 ] ; do

        CMD="echo $CUR"

        $CMD

        if [ $CUR -ge $END ] ; then
                break
        fi

        CUR=`date -d "$CUR 1day" "+%Y%m%d"`
done

コードの説明です。

変数BEGINには開始日付、変数ENDは終了日付です。今回はBEGINには2021年2月26日を、ENDにはdateコマンドを使って当日日付 (2021年3月15日)を設定しています。

繰り返し処理の前で変数CURを開始日の日付で初期化します。

繰り返し処理ではechoで日付を出力しています。

繰り返しの終了条件はCURENDよりも同じか大きくなった(当日か後の日付)になることです。

if [ $CUR -ge $END ] ; then
     break
fi

CURは繰り返しの度に↓のコードで1日ずつ先に進めます。

CUR=`date -d "$CUR 1day" "+%Y%m%d"`

上のプログラムの実行結果です。

$ ./run-for-days.sh 
run from 20210226 to 20210315
20210226
20210227
20210228
20210301
20210302
20210303
20210304
20210305
20210306
20210307
20210308
20210309
20210310
20210311
20210312
20210313
20210314
20210315
$

2月26日から3月15日まで1日ずつ表示されていますね。

echoしているところを実際に必要な処理にすると日付の範囲で繰り返すプログラムの出来上がりです。

これdateコマンドの違いでMacでは動かないんです。。なので、その部分はこちらにMacのdateコマンドについて書いてありますので、合わせて変更することで実行できます。

読んでくださってありがとうございました。

それではまた!