假设我只需要当前时间是从上午11点10分到下午2点半才能运行“命令”。如何在bash脚本中完成此操作?
下面用伪语言写的东西:
#!/bin/bash
while(1) {
if ((currentTime > 11:10am) && (currentTime <2:30pm)) {
run command;
sleep 10;
}
}
答案 0 :(得分:6)
其他答案忽略了当一个数字以 <罢工>因此,例如,当它是上午9点时,0
开头时,Bash会在基数8 †中解释它。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
如果您想要处理包含午夜的时间跨度,则只需将&&
替换为||
。