我有一个主脚本,每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”所建议的八进制值。有人可以帮助我如何照顾这些价值观吗?
我只需要一种方法来确保我的脚本在指定的时间跨度内运行。
答案 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