比较时间的好方法?


10

我需要检查当前时间,如果不是我应该运行它的一天中的适当时间,则中止脚本。另外,如果其他任何人运行它,它都应该中止。

例如:我需要脚本仅在10 PM到2 AM(4小时窗口)之间启动时才能运行。

目前,我正在执行以下操作。花时间date +%k%M与硬编码进行比较

#!/bin/sh
currTime=`date +%k%M`
check_time_to_run()
{
    tempTime=$1
    if [ $tempTime -gt 200 -a $tempTime -lt 2200 ]; then 
        echo "Time is between 2 AM and 10 PM. Aborting."
        exit 1
    else
        echo "Time is after 10 PM and before 2 AM. Running normally."
    fi
}

check_time_to_run $currentTime

我想知道是否有在相对时间比较任何其他有效的方法sh还是bash


1
如果您需要比较两个日期,请尝试将它们转换为MJD或UNIX时间,例如:date +%s
Eddy_Em

1
@Eddy不,这不是日期,这是我需要比较的时间。
mtk

1
我认为,以秒为单位会更好:currTime=$(date +%s); lower=$(date +%s --date="2:00"); upper=$(date +%s --date="22:00"); if [$currTime -gt $lower -a $currTime -lt $upper]; then
Eddy_Em

为什么不将脚本放入crontab?这样,您可以确保它在特定的时间运行
BitsOfNix

1
由于任何用户都可以使用来更改处理时间faketime,因此您的脚本不是很安全。使用锁文件可能是一个更好的选择。
jofel

Answers:


6

在我看来,这很完美。是什么让您认为应该改进呢?

无论如何,改善它的方法可能是:

  • 使用比dash或pdksh之类的bash更快更小的外壳。
  • 使用具有内置日期功能的外壳,例如zshksh93
  • 使用gawk(小于bash,但不小于破折号,但可以避免多余的分叉):

例:

#! /usr/bin/gawk -f
BEGIN {now = strftime("%k%M")+0; exit(now > 200 && now < 2200)}

嗯不错。只是想确认我在做什么不是粗鲁或邪恶的。感谢您的建议。
mtk

4

如果允许使用外部工具,则可能需要检查dateutils

您的“脚本”变为:

if dtest time --gt '02:00:00' && dtest time --lt '22:00:00'; then
    echo "Time is between 2 AM and 10 PM. Aborting."
fi

免责声明:我是上述工具的作者。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.