如何使用Bash在各个白天无限期地运行命令?

时间:2019-02-22 02:19:34

标签: bash cron

我试图编写一个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,但没有任何反应。

如果有人愿意,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

您的代码以一种不寻常的方式声明了一个函数。

通常,会编写一个函数:

name() { commands }

您有:

name() while ... done

这掩盖了一个事实,尽管您声明了一个函数,但从未真正运行它!

因此,解决方案是:

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

除此之外,while逻辑存在问题。考虑:

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

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

代替尝试:

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

答案 1 :(得分:0)

感谢@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或第二个代码中的第一个真if运行对应的feh,但是这个{{ 1}}将永远不会结束,因此第一个真实循环或条件将永远保持打开状态,并且只要此feh保持打开状态,就永远不会检查几天中的其他时间来更改图片。 我每天早晨,下午和晚上都在feh中添加了killall feh,这导致代码跳入下一个循环或条件检查。这不是最有效的方法,但现在可以正常工作。谢谢。