背景我是一名新手,可以击中脚本,通过谷歌搜索,我已经拥有了。
我有两个文本文件:包含
的" filemp3.txt"songname -Artist.mp3
songname2 -artist2.mp3
songname3 -artist3.mp3
和包含
的fileogg.txtsongname -Artist.ogg
songname2 -Artist2.ogg
songname3 -atrest3.ogg
我将使用Sox从MP3转换为OGG。
我有以下bash脚本:
#!/bin/bash
exec 3<Fileogg.txt
while read mp3; do
read -u3 ogg
echo sox "Musicmp3/$mp3" "Musicogg/$ogg"
done <Filemp3.txt
这完全输出了我想通过行运行的命令。
radio@radio:~$ ./convert-mp3-ogg.sh
sox Musicmp3/songname - artist.mp3 Musicogg/songname - artist.ogg
sox Musicmp3/songname2 - artist2.mp3 Musicogg/songname2 - artist2.ogg
sox Musicmp3/songname3 - artist3.mp3 Musicogg/songname3 - artist3.ogg
但是,当我编辑脚本以exec时,例如exec sox" musicmp3/$ mp3" musicogg/$ ogg" ...脚本运行&amp;创建了一个OGG文件,但仅适用于第一个文件名。
我假设这是我的bash脚本的问题,因为OGG文件效果很好,Sox没有显示我知道的任何错误。
exec
命令替换 用新命令在当前过程中执行的命令。这就像一个永远不会返回的子例程呼叫。在这种情况下,您只想致电sox
,然后在返回后继续,因此只需删除exec
:
while read mp3; do
read -u3 ogg
sox "Musicmp3/$mp3" "Musicogg/$ogg"
done < Filemp3.txt
exec
有两个无关的含义,这可能是您感到困惑的地方。您使用的第一个:
exec 3<Fileogg.txt
很好,它打开文件描述符 file'fileogg.txt'的数字3,并使用您的read -u3
读取。
不过,在同一过程中,exec
的第二次使用是用不同的程序替换为当前 program 。成功的exec
没有回报。所以当你:
exec sox "Musicmp3/$mp3" "Musicogg/$ogg"
用sox
代替bash
,因此您永远不会返回脚本!
只需删除exec
,您在这里不需要它:
sox "Musicmp3/$mp3" "Musicogg/$ogg"