3

假设,仅当当前时间是从上午 11:10 到下午 2:30 时,我才需要运行“命令”。这如何在 bash 脚本中完成?

像下面这样用伪语言写的:

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

3 回答 3

7

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

使用现代 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 在评论中指出的那样,它适用于古老的[内置......但那已成为过去:)

于 2013-11-03T17:25:43.443 回答
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更多详细信息,请参阅。除了从 11:30 开始运行此脚本之外,您还可以使用cron 作业执行更多操作。

注意:对于您的循环,您可以使用以下内容:

while [ 1 ]; do 
    #...
done

或者 :

while (( 1 )); do 
    #...
done
于 2013-11-03T16:53:10.297 回答
0

您可以创建一个描述当前时间的 4 位数字date +"%H%M"。我认为这可以用来在数字上与其他时间(以 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

如果您想处理包括午夜在内的时间跨度,您只需将 替换&&||.

于 2013-11-03T17:02:59.293 回答