如何使用bash无限期地基于各种日期运行命令



我正在尝试编写一个bash脚本,并在 raspberry pi 中的 rc.local上添加到启动时,每个靴子都留在后台,并显示不同的图像取决于一天中的时间。早上,下午和晚上的不同全屏图像。

我获得的命令是:

feh -Y -x -q -D 5 -B white -F --zoom max -r ~/Pictures/1-Morning/
feh -Y -x -q -D 5 -B white -F --zoom max -r ~/Pictures/2-Afternoon/
feh -Y -x -q -D 5 -B black -F --zoom max -r ~/Pictures/3-Night/

上面的所有命令单独工作并打开我想要的正确图像,但是当我将这些命令移动到bash脚本时,它们会停止工作。我尝试使用做到这一点,而却没有运气:

#!/bin/bash
fireup()
while [ $(date +"%T") -ge 06:00:00 ] && [ $(date +"%T") -lt 12:00:00 ];
  do
  killall feh ; feh -Y -x -q -D 5 -B white -F --zoom max -r ~/Pictures/1-Morning/;
  while [ $(date +"%T") -ge 12:00:00 ] && [ $(date +"%T") -lt 19:00:00 ];
  do
  killall feh ; feh -Y -x -q -D 5 -B white -F --zoom max -r ~/Pictures/2-Afternoon/
while [ $(date +"%T") -ge 19:00:00 ] && [ $(date +"%T") -lt 06:00:00 ];
  do
  killall feh ; feh -Y -x -q -D 5 -B black -F --zoom max -r ~/Pictures/3-Night/
done
done
done

我也尝试过crontab,但什么也没发生。

如果有人会提供帮助,我会很感激。

您的代码以稍微不寻常的方式声明函数。

最常写一个函数:

name() { commands }

您有:

name() while ... done

这掩饰了一个事实,尽管您声明了一个功能,但实际上从未运行它!

因此,解决方案是:

  • 删除行fireup()-在这种情况下,while循环将简单地运行
  • 附加线fireup以调用函数

除此之外,时代的逻辑有问题。考虑:

while [ $(date +"%T") -ge 06:00:00 ] && [ $(date +"%T") -lt 12:00:00 ];

此试图比较两组字符串,就好像它们是数字一样,这将永远不会成功,并且应该导致某种错误。

而是尝试:

while [[ $(date +%T) > 05:59:59 && $(date +%T) < 12:00:00 ]];

感谢@jhnc,我现在有两个代码。

使用while的第一个代码:

#!/bin/bash
while [[ $(date +%T) > 05:59:59 && $(date +%T) < 12:00:00 ]];
  do
  killall feh
  feh -Y -x -q -D 5 -B white -F --zoom max -r ~/Pictures/1-Morning/
  done
while [[ $(date +%T) > 11:59:59 && $(date +%T) < 19:00:00 ]];
  do
  killall feh
  feh -Y -x -q -D 5 -B white -F --zoom max -r ~/Pictures/2-Afternoon/
  done
while [[ $(date +%T) > 18:59:59 && $(date +%T) < 06:00:00 ]];
  do
  killall feh
  feh -Y -x -q -D 5 -B black -F --zoom max -r ~/Pictures/3-Night/
  done

if的第二个代码:

#!/bin/bash
while :; do   
   currenttime=$(date +%H:%M:%S)
   if [[ "$currenttime" > "05:59:59" ]] && [[ "$currenttime" < "12:00:00" ]]; then
   killall feh ; feh -Y -x -q -D 5 -B white -F --zoom max -r ~/Pictures/1-Morning/
   elif [[ "$currenttime" > "11:59:59" ]] && [[ "$currenttime" < "19:00:00" ]]; then
   killall feh ; feh -Y -x -q -D 5 -B white -F --zoom max -r ~/Pictures/2-Afternoon/
   else
   killall feh ; feh -Y -x -q -D 5 -B black -F --zoom max -r ~/Pictures/3-Night/
   fi
done

上面这两个代码的唯一问题是,第一个代码中的第一个真实while或第二个代码中的第一个True if,运行通讯feh,但此feh永远不会结束永远,只要此feh留在那里,就永远不会检查几天的其他时间以更改图片。我每天早晨,下午和晚上都在crontab中添加了killall feh,这会导致代码跳入下一个循环或条件检查。这不是最有效的方法,但现在正在起作用。谢谢。

最新更新