【问题标题】:while read line, only reading last line读行时,只读最后一行
【发布时间】:2014-04-07 02:13:09
【问题描述】:

我有一个小 bash 脚本,它应该读取一个文件并在 mplayer 中播放每一行。但它只播放每个文件的 1 秒,然后继续播放下一首歌曲。只有文件中的最后一行被正确播放。这是我目前所拥有的:

#!/bin/bash

file=/home/dummy/list.m3u

echo "################################"
while IFS= read -r line
        do
            echo "loadfile '$line'" > /tmp/mplayer.fifo
done < $file

文件中的行只包含 mp3 的路径,如下所示:/home/dummy/song.mp3

如何播放每一行并在歌曲结束后开始下一首歌曲?

另外,有没有办法以随机顺序读取行?

提前致谢。

【问题讨论】:

  • 使用&gt;&gt; 而不是&gt; 进行追加

标签: linux bash


【解决方案1】:

只有文件的最后一行可以正常播放。

使用&gt;&gt; 而不是&gt; 进行附加。您使用的是&gt;,它每次都会覆盖文件,因此您只能看到文件中的最后一行。

另外,有没有办法以随机顺序读取行?

您可以使用shufsort

while IFS= read -r line
do
  echo "loadfile '$line'" >> /tmp/mplayer.fifo
done < <(shuf $file)

sort -R filename 将执行随机排序。

【讨论】:

  • 感谢您的快速回复:shuf $file 似乎可以工作,但它仍然只播放一首歌曲。
  • @user3343273 那一定是因为你使用的是&gt;而不是&gt;&gt;
  • 这是我的脚本现在的样子:
  • echo "loadfile '$line'" >> /tmp/mplayer.fifo
  • 仍然只有一首歌曲正在播放。
【解决方案2】:
#!/bin/bash

file=/home/dummy/list.m3u
shuf -n file > randomshuffled
echo "################################"
while IFS= read -r line
do
        echo "loadfile '$line'" >> /tmp/mplayer.fifo
done < $( cat randomshuffled)

请参阅&gt;&gt; 以获取文件中的附加行。如果您想清空队列并开始新歌 - 只需在 while 循环之前添加行 echo "" &gt; /tmp/mplayer.fifo

shuf file &gt; randomshuffled 用于文件中行的随机洗牌

你也可以使用

mplayer -shuffle -playlist /home/dummy/list.m3u

【讨论】:

  • 嘿,谢谢你的快速回复,我用了你的例子,但是有一个错误:./script.sh: line 9: $randomshuffled: ambiguous redirect
  • randomshuffled 是一个文件,而不是一个变量,所以重定向中的 $ 导致了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多