ShellScript

シェルスクリプトで日付と時間を大小判定

More than 3 years have passed since last update.


bsdhack さんにいただいたコメントを反映しグローバル変数を除去しました。

ありがとう!



関数ソース

同じシェルスクリプトに関数を書くと酷く邪魔なので別ファイルにしています。

includeぽく使えて良いです。


datefx.sh

#!/bin/bash

# 日付大小比較
# arg1:'yyyy/mm/dd hh:mm:ss'
# arg2:'yyyy/mm/dd hh:mm:ss'
# 1が2より大きい場合、 +の数値を $ret に入れる
# 1が2より小さい場合、 -の数値を $ret に入れる
# 1が2と同じ大きさの場合、0 を $retに入れる
function dateComp()
{
# 1970/01/01 00:00:00 からの経過秒に変換
ARG1_SECOND=`date -d "$1" '+%s'`
ARG2_SECOND=`date -d "$2" '+%s'`

# 差を返却
expr $ARG1_SECOND - $ARG2_SECOND
}

function MyEcho()
{
echo "[`date '+%Y/%m/%d %T'`] $1"
}



使用例ソース


datefx_test.sh

#!/bin/bash

cd `dirname $0`
. ./datefx.sh

NowDateTime=`date '+%Y-%m-%d %T'`
AfterDateTime=`date -d "$NowDateTime 5 seconds" '+%Y-%m-%d %T'`

# 引数検査
argc=$#
if [ $argc -eq 1 ]; then
AfterDateTime=`date -d "$NowDateTime $1 seconds" '+%Y-%m-%d %T'`
fi

MyEcho "*** start ***"

while true
do
NowDateTime=`date '+%Y-%m-%d %T'`
ret=`dateComp "$NowDateTime" "$AfterDateTime"`
# ret=`dateComp "\`date '+%Y-%m-%d %T'\`" "$AfterDateTime"`
MyEcho "[$ret] dateComp \"$NowDateTime\" \"$AfterDateTime\""

if [ $ret -ge 0 ]; then
MyEcho "Exit Hit!"
break;
fi
sleep 0.5
done

MyEcho "*** end ***"



使用例

現在日時+5秒後の変数を作りnow()と比較するループです。

指定時間後に dateComp() の値が0以上となりループを終了します。

ekaneko@bibian ~/work/datefx % bash ./datefx_test.sh

[2014/05/27 12:33:09] *** start ***
[2014/05/27 12:33:09] [-5] dateComp "2014-05-27 12:33:09" "2014-05-27 12:33:14"
[2014/05/27 12:33:09] [-5] dateComp "2014-05-27 12:33:09" "2014-05-27 12:33:14"
[2014/05/27 12:33:10] [-4] dateComp "2014-05-27 12:33:10" "2014-05-27 12:33:14"
[2014/05/27 12:33:10] [-4] dateComp "2014-05-27 12:33:10" "2014-05-27 12:33:14"
[2014/05/27 12:33:11] [-3] dateComp "2014-05-27 12:33:11" "2014-05-27 12:33:14"
[2014/05/27 12:33:11] [-3] dateComp "2014-05-27 12:33:11" "2014-05-27 12:33:14"
[2014/05/27 12:33:12] [-2] dateComp "2014-05-27 12:33:12" "2014-05-27 12:33:14"
[2014/05/27 12:33:12] [-2] dateComp "2014-05-27 12:33:12" "2014-05-27 12:33:14"
[2014/05/27 12:33:13] [-1] dateComp "2014-05-27 12:33:13" "2014-05-27 12:33:14"
[2014/05/27 12:33:13] [-1] dateComp "2014-05-27 12:33:13" "2014-05-27 12:33:14"
[2014/05/27 12:33:14] [0] dateComp "2014-05-27 12:33:14" "2014-05-27 12:33:14"
[2014/05/27 12:33:14] Exit Hit!
[2014/05/27 12:33:14] *** end ***
ekaneko@bibian ~/work/datefx % bash ./datefx_test.sh 3
[2014/05/27 12:33:20] *** start ***
[2014/05/27 12:33:20] [-3] dateComp "2014-05-27 12:33:20" "2014-05-27 12:33:23"
[2014/05/27 12:33:21] [-2] dateComp "2014-05-27 12:33:21" "2014-05-27 12:33:23"
[2014/05/27 12:33:21] [-2] dateComp "2014-05-27 12:33:21" "2014-05-27 12:33:23"
[2014/05/27 12:33:22] [-1] dateComp "2014-05-27 12:33:22" "2014-05-27 12:33:23"
[2014/05/27 12:33:22] [-1] dateComp "2014-05-27 12:33:22" "2014-05-27 12:33:23"
[2014/05/27 12:33:23] [0] dateComp "2014-05-27 12:33:23" "2014-05-27 12:33:23"
[2014/05/27 12:33:23] Exit Hit!
[2014/05/27 12:33:23] *** end ***
ekaneko@bibian ~/work/datefx %


概要

2つの日付を比較し大小を返却する関数です。

2つの日付が同じ場合は0です。

単純な日の比較をしたい場合、時間を00:00:00で変数に詰め直せばいけます。

シェルの返却値は0~255の整数しか使えないので標準出力を経由し値を取得します。

シェルスクリプト内で定義した関数の出力を同じシェルスクリプト内でキャッチする発想がなかったです。

bsdhack さんありがとうございます!!!!


ほか

debianではdashがデフォルトシェルなので、CentOSから持ち込んだシェルがバシバシコケます。

/etc/passwd を変更するとか、そもそものファイルリンクを変えちゃった方がいいのかも…。