“If”“then”“else”和“return”命令语法

问题描述 投票:0回答:2

我是一个在焊接车间工作的管道工,需要音乐,因为商业广播非常重复。我去买了一台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
bash if-statement
2个回答
1
投票

我不相信你可以像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

0
投票

问题出在本声明中:

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),我相信这就是你想要的。

© www.soinside.com 2019 - 2024. All rights reserved.