chiwata’s blog

たまに技術の話をします。

スクリプトで月末の日を調べる

バイトで、半年前から先月まで、一ヶ月ごとのデータを調べる機会があった。

範囲を指定するときに、引数で月初月末の日付を渡していたが、なんかカッコ悪い。

せっかくの機会なのでどうやったら調べれるか試してみる。

環境はvirtualbox上のCentos7

dateコマンドの[d]オプションを使えば、いろいろできそう

[vagrant@localhost ~]$ date +'%Y-%m-%d' -d "2 month ago"
2018-03-27

なるほど

なら、月初の1日前を求めれば最終日になりそう(月初は絶対に1日だけど、月末は31,30,28などいろんなパターンがあるから)

[vagrant@localhost ~]$ date +'%Y-%m-%d' -d "2 month ago `date +'%Y-%m-01'` 1 days ago"
2018-02-28

ほうほう

で、何年何月からってやりたいから

[vagrant@localhost ~]$ date +%Y-%m-%d -d  "`date +'2017-03-01'` 1 days ago"
2017-02-28

で、あとはこれをいい感じにスクリプトにして

[vagrant@localhost ~]$ cat date_check.sh
#!/bin/bash

date +%Y-%m-%d -d  "`date +'$1-$2-01'` 1 days ago"

[vagrant@localhost ~]$ ./date_check.sh 2017 03
date: `$1-$2-01 1 days ago' は無効な日付です

あれ、変数が展開されない。。。。

調べたら、シングルクオートは変数展開されないらしい。 そして、入力した月の最終日がしりたいので、月に1をたしてから計算しよう

#!/bin/bash

YEAR=$1
MONTH=$(($2+1))

date +%Y-%m-%d -d  "`date +"$YEAR-$MONTH-01"` 1 days ago"
[vagrant@localhost ~]$ ./date_check.sh 2017 03
2017-03-31

できたできた。