【问题标题】:checking if current time is between two times in HHmmss format in shell script检查当前时间是否在 shell 脚本中 HHmmss 格式的两倍之间
【发布时间】:2017-03-13 13:14:33
【问题描述】:

我有一个主脚本,每 10 分钟调用一次 doSomeWork.sh。

但条件是 doSomeWork.sh 不应该在 23:30:00 到 03:00:00 之间运行。

我的脚本如下所示。

#!/bin/ksh
prodStartTime="030000"
prodEndTime="233000"

currentTime=`date +"%H%M%S"`
echo $prodStartTime
echo $prodEndTime
echo $currentTime
while true
do
if [[ $currentTime -ge $prodStartTime && $currentTime -le $prodEndTime ]];
then
      ./doSomeWork.sh
else
 echo Do Nothing
fi
sleep 600
done

更新:现在我通过检查生产时间而不是夜间模式时间来使代码工作(请参阅编辑历史记录)。但看起来我的脚本正在考虑 cmets 中“twalberg”所建议的八进制值。有人可以帮助我如何处理这些价值观吗?

我只需要一种方法来确保我的脚本在指定的时间范围内运行。

【问题讨论】:

  • 没有理由为这些分配使用 echo,只需分配它们。 nightModeStartTime=230000; nightModeEndTime=033000
  • 这不起作用怎么办?此外(当您按下遮光窗口时)睡更长的时间(甚至可能一次几乎是整个窗口的长度)以避免在窗口期间如此频繁地循环可能是有意义的。
  • 您是否考虑过您的033000(以及来自date 的任何带有前导零的结果)可能被解释为八进制数?你并没有真正解释它是如何不工作的,所以这只是一个猜测......@ 987654325@ 就是这种情况,但我不知道你正在使用的ksh 版本是否会做或不做。
  • 脚本,如图所示,不会在 23:00:00 和 03:30:00 之间运行 ./doSomeWork.sh(不是你写的 23:30:00 和 03:00:00),如果这是一个问题。

标签: shell unix ksh


【解决方案1】:

不要用数字比较它们(-ge-le);只需将它们作为字符串进行比较。由于ksh 没有>=<=,因此您可以使用等效的! <! >

if [[ ! "$currentTime" < "$prodStartTime" && ! "$currentTime" > "$prodEndTime" ]]; then
  ./doSomeWork.sh
fi

但由于我们是在否定,如果我们应用德摩根定律并且只否定一次可能会更清楚:

if [[ ! ( "$currentTime" < "$prodStartTime" || "$currentTime" > "$prodEndTime" ) ]]; then
   ./doSomeWork.sh
fi

无论如何,当使用&lt;&gt; 时,不必担心将字符串解释为数字(八进制或其他)。只要所有时间的位数相同,字符串比较就会产生正确的答案。

【讨论】:

  • 撤销对答案的接受,因为我的脚本逻辑错误而不是语法错误。
  • 您应该接受这个答案,而不是您自己的:尽管您纠正了问题,但您的脚本仍然是错误的,因为它将值作为数字进行比较(实际上有时是八进制数,有时是十进制数)当@Mark Read 注释时,它们应该作为字符串进行比较。你现在拥有的可能起作用,但只是偶然。
  • @NormanGray ksh 中的八进制解释在内部通过去除 0 来处理。见stackoverflow.com/a/3192381/2557818
【解决方案2】:

我应该计算循环内的当前时间。但我只在循环之外计算了一次,并且整天使用相同的值。

脚本应该是这样的。

#!/bin/ksh
prodStartTime="030000"
prodEndTime="233000"

echo $prodStartTime
echo $prodEndTime
echo $currentTime
while true
do
currentTime=`date +"%H%M%S"`
if [[ $currentTime -ge $prodStartTime && $currentTime -le $prodEndTime ]];
then
      ./doSomeWork.sh
else
 echo Do Nothing
fi
sleep 600
done

不知何故,这个愚蠢的错误在我的眼中是不可见的。

【讨论】:

  • @MarkReed 不想责怪任何人。这只是对我自己的嘲讽。编辑了答案以便更好地理解。
【解决方案3】:

你也可以轻松地做到这一点..

#!/bin/bash

prodStart="132000"
prodEnd="151500"

while [[ ! $(( `date +"%H%M%S"` )) < "$prodStart" && ! $(( `date +"%H%M%S"` )) > "$prodEnd" ]];
do
        echo "Do something..."
done

【讨论】:

    【解决方案4】:
    startTime="80000"
    endTime="200000"
    curTime=$(date  +"%H%M%S" | bc)
    echo "startTime : "$startTime
    echo "endTime : "$endTime
    echo "currentTime :"$curTime
    echo "curTime <  endTime and  curTime > startTime then don't execute"
    # Messages will be sent only between 8AM to 8PM
    if [[ ! ( $curTime -lt  "$endTime" && $curTime -gt "$startTime" ) ]];
    then
    echo "Don't Execute"
    else
    echo "Execute"
    fi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2013-06-13
      • 2013-08-10
      相关资源
      最近更新 更多