我正在尝试检查运行时间,如果超过一个小时,则返回错误,但代码间歇性地返回误报。在 中firstRun.sh
,我将时间读为:
export START_H=`date +%H`
export START_M=`date +%m`
并在secondRun.sh
我检查时间如下:
CURRENT_H=`date +%H`
CURRENT_M=`date +%M`
TIME=`expr $CURRENT_H - $START_H`
if [ $TIME -gt 0 ] && [ $START_M -lt $CURRENT_M ]; then
echo "boot time is more than an hour"
fi
谁能帮我找出问题可能出在哪里?在 if 语句中使用&&
和使用有什么区别吗?-a
或者使用[]
和之间有什么区别()
?
答案1
export BOOT_TIME=$(date +%s)
current=$(date +%s)
(( current - BOOT_TIME >3600 )) && echo "More than an hour"
%s
返回自 1970-01-01 00:00:00 UTC 以来的秒数。
讨论:为什么秒更好
例如,假设开始(引导)时间为 23:00,当前时间为 00:23。那么,$TIME
是负数,这将不起作用:
if [ $TIME -gt 0 ] && [ $START_M -lt $CURRENT_M ]; then
echo "boot time is more than an hour"
fi
同样,假设开始时间为 12:03,当前时间为 14:00。然后,上面的方法也不起作用,这次是因为分钟测试。
答案2
这里有两个问题
在单独的语句中设置当前时间的小时和分钟时,存在潜在的竞争条件(考虑小时顶部的分钟滚动)。
在您的第一个脚本片段中,您使用了
%m
几分钟(但这实际上是几个月)。在你的第二个你正在使用%M
.
我的建议是,你最好HHMM=$(date +'%H %M')
将其分成两部分。更好的是,将时间视为自纪元以来的秒数的组合值SECONDS=$(date --utc +'%s')
,并允许每小时包含 3600 秒。 (该--utc
部分避免了每年两次的当地时间变化。)