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
うまく表示できた。だから失敗例から成功例に変わった。
参考
コメント