在Bash中执行时间戳比较的最佳方法是什么

在Bash中执行时间戳比较的最佳方法是什么,bash,time,Bash,Time,我有一个警报脚本,我正试图阻止向我发送垃圾邮件,因此我想设置一个条件,如果警报在最近一个小时内发送,则不发送另一个警报。现在我有一个cron任务,每分钟检查一次条件,因为当条件满足时,我需要快速得到提醒,但在问题得到控制之前,我不需要每次收到一封电子邮件。在bash中比较时间的最佳方法是什么?使用“test”: 编辑:如果您想知道事件发生的时间,可以使用“触摸”创建一个文件,稍后可以使用“测试”进行比较。使用date命令将两个时间转换为标准格式,并减去它们。您可能希望将以前的执行时间存储在点文件

我有一个警报脚本,我正试图阻止向我发送垃圾邮件,因此我想设置一个条件,如果警报在最近一个小时内发送,则不发送另一个警报。现在我有一个cron任务,每分钟检查一次条件,因为当条件满足时,我需要快速得到提醒,但在问题得到控制之前,我不需要每次收到一封电子邮件。在bash中比较时间的最佳方法是什么?使用“test”:


编辑:如果您想知道事件发生的时间,可以使用“触摸”创建一个文件,稍后可以使用“测试”进行比较。

使用date命令将两个时间转换为标准格式,并减去它们。您可能希望将以前的执行时间存储在点文件中,然后执行以下操作:

last = cat /tmp/.lastrun
curr = date '+%s'

diff = $(($curr - $last))
if [ $diff -gt 3600 ]; then
    # ...
fi

echo "$curr" >/tmp/.lastrun

(谢谢,史蒂夫。)

到目前为止,最简单的方法是将时间戳存储为虚拟文件的修改时间。GNU
touch
date
命令可以设置/获取这些时间并执行日期计算。Bash有测试来检查一个文件是否比另一个文件更新(
-nt
)或旧(
-ot

例如,要仅在上一次通知超过一小时前发送通知,请执行以下操作:

touch -d '-1 hour' limit
if [ limit -nt last_notification ]; then
    #send notification...
    touch last_notification
fi

谢谢,我不知道-nt位。我可以在警报第一次触发时创建一个文件,并在条件恢复时删除它(在这种情况下,我可以检查是否存在)。你知道我如何实现“如果至少一个小时后再次抛出警报”位吗?我相信@Bruno回答了这个问题。为什么不使用纪元(%s)后的秒数?一小时3600秒。我喜欢这种方法,它不依赖于较新版本的bash。busybox可以做到这一点。我认为您需要在到目前为止的通话中使用backticks或
$()
。注意:我发现-nt不起作用,除非时间戳之间至少有1秒的差异。为了测试一个文件是否是“新的”,我将它与我“接触过的”一个临时文件进行了比较。我在其中添加了一个“sleep 1”来解释这个-nt问题。看起来这种比较实际上是最简单的方法,但如果你不喜欢我的睡眠建议,你可能需要根据需要进行更精确的日期/时间比较。请注意,
-nt
是POSIX的扩展:
touch -d '-1 hour' limit
if [ limit -nt last_notification ]; then
    #send notification...
    touch last_notification
fi