如何检查当前时间是否在 23:00 和 06:30 之间

Sin*_*abi 18 scripting date

如果当前时间在 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)

笔记:

  • Time inHH:MM将按字典顺序排列,因此您可以直接将它们作为字符串进行比较。
  • 避免使用-aor -oin[ ],使用||and&&代替。
  • 由于这是bash的,喜欢[[ ]][ ],它使生活更轻松。


Jef*_*ler 7

如果您想更明确地说明要匹配的时间,可以使用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)