date コマンドで期間を表示する

1.date コマンド

○月○日といった特定の日を対象として、その日付を取得したり、それまでの日数を取得したりするコマンドである。

では、「○月○日〜■月■日まで」といった期間を取得できないだろうか?  

参考:https://hydrocul.github.io/wiki/commands/date.html

 目標は、こんな出力である。明日から向こう1ヶ月を表示するスクリプト。

2018/10/28
2018/10/29
2018/10/30
2018/10/31
2018/11/01
2018/11/02
2018/11/03
2018/11/04
2018/11/05
2018/11/06
(中略)
2018/11/27

2.while 文で実現する

前提として、date コマンドの オプション、引数のフォーマットと変数との関係である。

date -d オブション ‘ x day’ とか ‘x day ago’でx日後(日前)を出力させることができるが、変数を取り扱う場合はダブルクォーテーションを使うこと。

場合によっては、${x}の表現形式も必要だ。

 参考

https://qiita.com/mochizukikotaro/items/f3a78d631595f9744a75

kikan=1
kikan_end=31
# 変数kikanの初期値は1 期間の終わりの変数kikan_endは31

while [ "$kikan" -le "$kikan_end" ]
# 変数 kikan を kikan_end 変数以下の回数を繰り返す
 do
    echo `date +%Y/%m/%d -d "$kikan days'`  
       # 変数 kikan の値を展開して date コマンドの引数として扱う
    let "kikan=kikan + 1"
       # 変数 kikan に1を加算していく。
 done

3.seq コマンドで実現する

seq コマンドが連続した数字の列を出力・表示するので、これを利用する方法があるのではないかと実験した。

kikan=`seq 1 31`  


for kikan2 in `date +%Y/%m/%d -d "${kikan} days"`
 do
        echo kikan2
done

 出力結果は

date: invalid date ‘1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31 days’

seq コマンドが 1を吐いたら ‘1 day’、 2を吐いたら’2 day’と順よくやってくれると思ったら一気に1~31を吐いた上でdayを出力している。

しかも区切り文字も出力されている。

これでは、date コマンドも そんな日あるわけないよ、ってなことになる。

単に数字を順に出力するのではなく、「数字列」の出力ってことか! 

どうも納得行かない!

seq 1 3 を実行すれば以下の表示が得られる。

1
2
3

で、これにfor文の繰り返しを組み合わせると、3回繰り返すと同時に、数字の1〜3を出力するのだろう。

いろいろ試行錯誤したら、出力される数字を加工し以下のようにすればdateコマンドに渡しやすいと!

1 day
2 day
3 day

そこで、変数の出力結果と文字を組み合わせて出力し、これをdateコマンドに渡してみた。

#!/usr/bin/bash

for day in `seq 1 31`
  do
      str="${day} day"
       # dateコマンドの-dオプションの引数の形式に直した
      echo `date +%Y/%m/%d -d "$str"`
  done

うまく表示できた。だから失敗例から成功例に変わった。

 参考

https://hacknote.jp/archives/20987/

コメント

タイトルとURLをコピーしました