如果当前时间在 23:00 和 06:30 之间,我无法掌握如何从 bash 脚本中正确检查。我正在尝试运行一个无限循环来检查现在的时间,并在时间范围在晚上 11 点到早上 6 点 30 之间时做一些事情。这是我到目前为止所写的内容,第二天不起作用:
fireup()
{
local starttime=$(date --date="23:00" +"%s")
local endtime=$(date --date="06:30" +"%s")
while :; do
local currenttime=$(date +%s)
if [ "$currenttime" -ge "$starttime" -a "$currenttime" -ge "$endtime" ]; then
do_something
else
do_something_else
fi
test "$?" -gt 128 && break
local currenttime=$(date +%s)
done &
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
mur*_*uru 31
如果您只需要检查是否HH:MM
在 23:00 和 06:30 之间,则不要使用 Unix 时间戳。只需HH:MM
直接检查值:
fireup()
{
while :; do
currenttime=$(date +%H:%M)
if [[ "$currenttime" > "23:00" ]] || [[ "$currenttime" < "06:30" ]]; then
do_something
else
do_something_else
fi
test "$?" -gt 128 && break
done &
}
Run Code Online (Sandbox Code Playgroud)
笔记:
HH:MM
将按字典顺序排列,因此您可以直接将它们作为字符串进行比较。-a
or -o
in[ ]
,使用||
and&&
代替。[[ ]]
过[ ]
,它使生活更轻松。如果您想更明确地说明要匹配的时间,可以使用case
语句。这是一个 24 小时循环,其中包含一个 case 语句,指示当前时间是否与您的范围匹配:
for hh in {00..23}
do
for mm in {00..59}
do
case $hh:$mm in
(23:*) echo YES $hh:$mm;;
(0[012345]:*) echo YES $hh:$mm;;
(06:[012]*) echo YES $hh:$mm;;
(*) echo NO $hh:$mm;;
esac
done
done
Run Code Online (Sandbox Code Playgroud)
要在脚本中使用它,只需调用以下变量替换变量date
:
case $(date +%H:%M) in
(23:*) echo YES;;
(0[012345]:*) echo YES;;
(06:[012]*) echo YES;;
(*) echo NO;;
esac
Run Code Online (Sandbox Code Playgroud)
您可能会考虑对您的 CPU 更友好,并计算(现在)和下一个开始时间之间的时间sleep
量,以及这段时间。
小智 6
您可以将时间转换为自“今天”开始以来的秒数,然后检查秒值是否大于23*60*60
(82800) 或小于6*60*60+30*60
(23400)。
要获取自“今天”开始以来的秒数,您可以执行以下操作:
secsSinceMidnight=$(( $(date +%s) - $(date -d '00:00:00' +%s) ))
Run Code Online (Sandbox Code Playgroud)
测试将是:
[[ $secsSinceMidnight -lt 23400 || $secsSinceMidnight -gt 82800 ]] && echo YES
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
53558 次 |
最近记录: |