Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在shell脚本中检查当前时间是否介于HHmmss格式的两次之间_Shell_Unix_Ksh - Fatal编程技术网

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

在shell脚本中检查当前时间是否介于HHmmss格式的两次之间,shell,unix,ksh,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 [

我有一个主脚本,每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”在评论中所建议的那样。有人能帮我处理这些价值观吗


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

不要对它们进行数字比较(
-ge
-le
);只需将它们作为字符串进行比较。因为
ksh
没有
=
“$prodEndTime”];然后
//doSomeWork.sh
fi
但既然我们在否定,如果我们应用德摩根定律,只否定一次,可能会更清楚:

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

在任何情况下,当使用
时,都不会将字符串解释为数字(八进制或其他形式)。只要所有时间的位数相同,字符串比较就会得到正确的答案。

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

脚本应该是这样的

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

不知怎的,我看不出这个愚蠢的错误。

你也可以用简单的方法来做

#!/bin/bash

prodStart="132000"
prodEnd="151500"

while [[ ! $(( `date +"%H%M%S"` )) < "$prodStart" && ! $(( `date +"%H%M%S"` )) > "$prodEnd" ]];
do
        echo "Do something..."
done
#/bin/bash
prodStart=“132000”
prodEnd=“151500”
而[[!$(`date+%H%M%S`))<“$prodStart”&&!$(`date+%H%M%S`))>“$prodEnd”];
做
echo“做点什么…”
完成
startTime=“80000”
endTime=“200000”
curTime=$(日期+%H%M%S”|公元前)
echo“startTime:$startTime
echo“endTime:$endTime
echo“currentTime:$curTime
echo“curTimestartTime然后不执行”
#消息将仅在上午8点到晚上8点之间发送
如果[!($curTime-lt“$endTime”和&$curTime-gt“$startTime”)];
然后
回声“不执行”
其他的
回显“执行”
fi

没有理由对这些分配使用echo,只需分配它们即可<代码>夜间工作时间=230000;nightModeEndTime=033000这不起作用怎么办?此外,(当您点击“blackout”窗口时)长时间睡眠(甚至可能一次几乎是整个窗口的长度)也可能是有意义的,以避免在窗口期间如此频繁地循环。您是否考虑过您的
033000
(以及
date
中有前导零的任何结果)是否可能被解释为八进制数?你没有真正解释它是如何不起作用的,所以这只是一个猜测,尽管。。。在
bash
中就是这种情况,但我不知道您正在使用的
ksh
版本是否会这样做。如图所示,脚本不会在23:00:00和03:30:00之间运行
/doSomeWork.sh
(与您编写的23:30:00和03:00:00不同),如果这是一个问题。取消接受答案作为我的脚本逻辑是错误的,而不是语法错误。你应该接受这个答案,而不是你自己的答案:尽管你纠正了错误,你的脚本仍然是错误的,因为它将值作为数字进行比较(有时是八进制数字,有时是十进制数字)当as@Mark读取注释时,它们应作为字符串进行比较。您现在所拥有的可能会起作用,但这只是偶然的。@NormanGray ksh中的八进制解释是由剥离0s在内部处理的。看@MarkReed不想责怪任何人。这只是对我自己的嘲弄。为了更好地理解,删去了答案。
#!/bin/bash

prodStart="132000"
prodEnd="151500"

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