假设,仅当当前时间是从上午 11:10 到下午 2:30 时,我才需要运行“命令”。这如何在 bash 脚本中完成?
像下面这样用伪语言写的:
#!/bin/bash
while(1) {
if ((currentTime > 11:10am) && (currentTime <2:30pm)) {
run command;
sleep 10;
}
}
其他答案忽略了当数字以 开头时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 在评论中指出的那样,它适用于古老的[
内置......但那已成为过去:)
。
你可以尝试类似的东西:
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
您可以创建一个描述当前时间的 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
如果您想处理包括午夜在内的时间跨度,您只需将 替换&&
为||
.