月末だけ実行したい処理があるなどの場合、月末は28, 29, 30, 31と4種類あります。
そこで、dateコマンドを利用して月末を調べる方法を以下に記します。
翌日が1日であれば、本日は月末ですよね。
これを、dateコマンドで再現してみます。
以下コマンドで翌日が表示されます。(4つとも同じ動作になります。)
date --date '1 day'
date --date '+1 day'
date -d '1 day'
date -d '+1 day'
これで翌日の日時が表示されます。
実行結果は以下のようになります。
[sakura@centos ~]$ date 2012年 5月 22日 火曜日 11:04:12 JST [sakura@centos ~]$ date --date '1 day' 2012年 5月 23日 水曜日 11:04:14 JST [sakura@centos ~]$ date --date '+1 day' 2012年 5月 23日 水曜日 11:04:14 JST [sakura@centos ~]$ date -d '1 day' 2012年 5月 23日 水曜日 11:04:14 JST [sakura@centos ~]$ date -d '+1 day' 2012年 5月 23日 水曜日 11:04:14 JST
日付だけを取得したのいので+%dオプションを利用します。
manコマンドでdateコマンドを確認すると以下の記述があります。
日付フィールド
<省略>
%d 月内通算日数 (01..31)
<省略>
したがって、+%dを利用することにより、翌日の日付のみを取得できます。
以下のようになります。
date --date '1 day' +%d
実行結果は以下のようになります。
[sakura@centos ~]$ date 2012年 5月 22日 火曜日 11:08:18 JST [sakura@centos ~]$ date +%d 22 [sakura@centos ~]$ date --date '1 day' +%d 23
以下のサンプルスクリプトのようにdateコマンドから返却された値が1だった場合、月末となります。
#!/bin/bash nextday=`date --date '1 day' +%d` if [ $nextday -eq 1 ]; then echo `date +%Y/%m/%d` is end of the month. else echo `date +%Y/%m/%d` is *NOT* end of the month. fi
実行結果
[sakura@centos ~]$ date 2012年 5月 30日 水曜日 11:16:30 JST [sakura@centos ~]$ ./chk-eom.sh 2012/05/30 is *NOT* end of the month.
[sakura@centos ~]$ date 2012年 5月 31日 木曜日 11:17:01 JST [sakura@centos ~]$ ./chk-eom.sh 2012/05/31 is end of the month.