我是一个在焊接车间工作的管道工,需要音乐,因为商业广播非常重复。我去买了一台RPI3,并用fm_transmitter程序将Raspian Stretch Lite放在上面。我得到的shell脚本足够远,以至于收音机工作正常,但有时我会在短时间内再次播放一首歌。这是偶然的,因为RANDOM_FILE变量从整个目录中选择。我还得到了脚本来记录在文本文件中播放的每首歌曲。我想使用tail和grep在文本文件中搜索当前选定的RANDOM_FILE,并检查它是否存在于日志中最后X个歌曲中。如果grep命令中存在RANDOM_FILE,我希望脚本在顶部重新启动,定义新的RANDOM_FILE。如果它不存在,我希望脚本继续,允许RANDOM_FILE通过fm_transmitter程序播放。
我还希望有人检查定义RANDOM_FILE的字符串实际上是非常随机和正确的。
下面是它当前形式的脚本。我相信我很亲近,但在某个地方出错了,因为我还在重复。我需要“if”“then”“else”和“return”命令的帮助。我希望这是一个快速简便的解决方案。
提前感谢任何花时间帮助我的人。
#!/bin/bash
while :
do
files=(/home/pi/music/*.wav)
RANDOM_FILE="${files[RANDOM % ${#files[@]}]}"
if tail -n 25 /home/pi/transmit_log.txt | grep "$RANDOM_FILE" = true ; then
echo -e "---SONG_SKIPPED---" >> /home/pi/transmit_log.txt ; return 7
else
# [ tail -n 25 /home/pi/transmit_log.txt | grep "$RANDOM_FILE" = false ] ; then
return 22
fi
echo -e "$RANDOM_FILE" >> /home/pi/transmit_log.txt
sox -v 3 "$RANDOM_FILE" -r 44100 -c 1 -b 16 -t wav - | sudo ./fm_transmitter -f 91.7 -
sleep .5
done
我不相信你可以像if / else语句那样返回。返回在函数中用于返回值。相反,您可以使用continue,这将跳过循环的下一次迭代(并修复codeforester建议的测试):
#!/bin/bash
while :
do
files=(/home/pi/music/*.wav)
RANDOM_FILE="${files[RANDOM % ${#files[@]}]}"
if tail -n 25 /home/pi/transmit_log.txt | grep -q "$RANDOM_FILE" ; then
echo "---SONG_SKIPPED---" >> /home/pi/transmit_log.txt
continue
fi
echo "$RANDOM_FILE" >> /home/pi/transmit_log.txt
sox -v 3 "$RANDOM_FILE" -r 44100 -c 1 -b 16 -t wav - | sudo ./fm_transmitter -f 91.7 -
sleep .5
done
或者,如下所示拆分测试可能更好,以使if条件更小,更易读:
already_played=$( tail -n 25 /home/pi/transmit_log.txt | grep "$RANDOM_FILE" )
if [ ! -z "$aldeady_played" ]; then
...
fi
问题出在本声明中:
if tail -n 25 /home/pi/transmit_log.txt | grep "$RANDOM_FILE" = true; then ...
正确的方法是:
if tail -n 25 /home/pi/transmit_log.txt | grep -q "$RANDOM_FILE"; then ...
在你的构造中,= true
将作为参数传递给grep
。那不是你想要的,对吧?如果找到模式,grep -q
将返回0(或true),我相信这就是你想要的。