LoginSignup
44
48

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-05-26

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 を変更するとか、そもそものファイルリンクを変えちゃった方がいいのかも…。

44
48
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
48