日次でログ解析を自動化するときなどに、実行日の昨日に相当するタイムスタンプ(YYYYMMDD形式)を取得する方法をよく使う。何かの都合で期日指定で動かしたいことを想定したパラメータ処理を入れておくと、次のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/bin/sh YYYY=`date --date 'yesterday' +%Y`; MM=`date --date 'yesterday' +%m`; DD=`date --date 'yesterday' +%d`; while getopts 'y:m:d:b:' opt "$@" do if [ $opt == y ]; then YYYY=$OPTARG; fi if [ $opt == m ]; then MM=$OPTARG; fi if [ $opt == d ]; then DD=$OPTARG; fi done echo $YYYY; echo $MM; echo $DD; |
引用時の改行が上手く表示できなかったので、リライト。
ちなみに、上記シェルでyesterday取得するときに日付をまたがると
期待しない値になる場合(*1)があるので、
1 2 3 4 |
YYYYMMDD=`date --date 'yesterday' +%Y%m%d`; YYYY=`echo $YYYYMMDD | awk '{print substr($1,1,4)}'`; MM=`echo $YYYYMMDD | awk '{print substr($1,5,2)}'`; DD=`echo $YYYYMMDD | awk '{print substr($1,7,2)}'`; |
とするのが良い。(ちょっと手抜きしすぎでしたね)
*1 以下のようなケースが想定される。
1.年をまたがる場合(例:2006/12/31→2007/01/01)
YYYYとMMの間(MMとDDの間も同じ現象)
・期待する値
YYYY=2006
MM=12
DD=30
・期待しない値
YYYY=2006
MM=12
DD=31
2.月をまたがる場合(例:2007/01/31→2007/02/01)
YYYYとMMの間(MMとDDの間も同じ現象)
・期待する値
YYYY=2007
MM=01
DD=30
・期待しない値
YYYY=2007
MM=01
DD=31
3.毎月1日から同2日をまたがる場合(例:2007/02/01→2007/02/02)
YYYYとMMの間
・期待する値
YYYY=2007
MM=01
DD=31
・期待しない値
YYYY=2007
MM=02
DD=01
MMとDDの間
・期待する値
YYYY=2007
MM=01
DD=31
・期待しない値
YYYY=2007
MM=01
DD=01
4.2007/01/01から2007/01/02をまたがる場合
YYYYとMMの間
・期待する値
YYYY=2006
MM=12
DD=31
・期待しない値
YYYY=2006
MM=01
DD=01
MMとDDの間
・期待する値
YYYY=2006
MM=12
DD=31
・期待しない値
YYYY=2006
MM=12
DD=01
No comments yet. You should be kind and add one!
By submitting a comment you grant typista a perpetual license to reproduce your words and name/web site in attribution. Inappropriate and irrelevant comments will be removed at an admin’s discretion. Your email is used for verification purposes only, it will never be shared.