如何在指定的时间段内在bash脚本中运行命令?

时间:2013-11-03 16:46:39

标签: linux bash

假设我只需要当前时间是从上午11点10分到下午2点半才能运行“命令”。如何在bash脚本中完成此操作?

下面用伪语言写的东西:

#!/bin/bash
while(1) {
    if ((currentTime > 11:10am) && (currentTime <2:30pm)) {
        run command;
        sleep 10;
    }
}

3 个答案:

答案 0 :(得分:6)

其他答案忽略了当一个数字以0开头时,Bash会在基数8 中解释它。 <罢工>因此,例如,当它是上午9点时,date '+%H%M'将返回0900,这是Bash中的无效数字。 (不再是)。

使用现代Bash的正确而安全的解决方案:

while :; do
    current=$(date '+%H%M') || exit 1 # or whatever error handle
    (( current=(10#$current) )) # force bash to consider current in radix 10
    (( current > 1110 && current < 1430 )) && run command # || error_handle
    sleep 10
done

如果您在第一次运行中接受潜在的10秒延迟,可能会缩短一点:

while sleep 10; do
    current=$(date '+%H%M') || exit 1 # or whatever error handle
    (( current=(10#$current) )) # force bash to consider current in radix 10
    (( current > 1110 && current < 1430 )) && run command # || error_handle
done

完成!


看:

$ current=0900
$ if [[ $current -gt 1000 ]]; then echo "does it work?"; fi
bash: [[: 0900: value too great for base (error token is "0900")
$ # oooops
$ (( current=(10#$current) ))
$ echo "$current"
900
$ # good :)

正如xsc在评论中指出的那样,它适用于古老的[内置...但这已成为过去:)

答案 1 :(得分:2)

您可以尝试以下方式:

currentTime=$(date "+%H%M")
if [ "$currentTime" -gt "1110" -a "$currentTime" -lt "1430" ]; then
    # ...
fi
# ...

或者:

currentTime=$(date "+%H%M")
if [ "$currentTime" -gt "1110" ] && [ $currentTime -lt "1430" ]; then
    # ...
fi
# ...

或者:

currentTime=$(date "+%H%M")
[ "$currentTime" -gt "1110" ] && [ "$currentTime" -lt "1430" ] && {
    # ...
}
# ... 

有关详细信息,请参阅man date。您还可以使用cron job执行操作,而不是从11:30开始运行此脚本。

注意:对于你的循环,你可以使用类似的东西:

while [ 1 ]; do 
    #...
done

或者:

while (( 1 )); do 
    #...
done

答案 2 :(得分:0)

您可以使用date +"%H%M"创建一个描述当前时间的4位数字。我认为这可以用来与其他时间(24小时格式)进行数字比较:

while [ 1 ]; do
    currentTime=$(date +"%H%M");
    if [ "$currentTime" -gt 1110 ] && [ "$currentTime" -lt 1430 ]; then
        ...
    fi
    sleep 10;    # probably better to have this outside the if-statement
done

如果您想要处理包含午夜的时间跨度,则只需将&&替换为||