在shell脚本中以HHmmss格式检查当前时间是否介于两次之间

时间:2014-12-05 13:15:54

标签: shell unix ksh

我有一个主脚本,每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

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

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

4 个答案:

答案 0 :(得分:6)

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

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

但是既然我们已经否定了,那么如果我们适用德莫根定律并且只能否定一次就更清楚了:

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

在任何情况下,当使用<>时,不会担心字符串会被解释为数字(八进制或其他)。只要所有时间都具有相同的位数,字符串比较就会产生正确的答案。

答案 1 :(得分:3)

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

脚本应该是。

#!/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

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

答案 2 :(得分:1)

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

#!/bin/bash

prodStart="132000"
prodEnd="151500"

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

答案 3 :(得分:0)

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