从 bash 脚本将路径和文件名传递给程序

从 bash 脚本将路径和文件名传递给程序

我使用一种名为 mp3wrap 的实用程序,它将多个 mp3 合并为一个。假设我有一个目录“album 1”,其中包含三个文件“track 1.mp3”、“track 2.mp3”和“track 3.mp3”。我将运行以下命令:

mp3wrap album\ 1.mp3 album\ 1/*.mp3

它将把“album 1”目录(第二个参数)中的所有三个曲目合并到一个新文件“album 1.mp3”(第一个参数)中。

我有很多这样的目录,“专辑 2”、“专辑 3”等,我想编写一个脚本来自动化该过程。我试过这个:

for i in album*
do
  mp3wrap $i.mp3 $i/*.mp3
done  

但我得到了错误

1.mp3: No such file or directory

看来我的脚本将 $i 扩展为“album 1.mp3”,它作为两个单独的参数传递。经过一番搜索和阅读后,我得到了以下结果:

for i in album*
do
  mp3wrap "${i}.mp3" "${i}/*.mp3"
done  

现在我没有收到错误消息,而是从 mp3wrap 程序中收到“使用”页面。很明显,它接收参数的方式与我从命令行运行命令时的方式不同,而且我不知道如何检查 bash 脚本执行时实际的命令行是什么样的。

我究竟做错了什么?任何帮助表示赞赏!

答案1

你离它很近了。这是正确的代码:

for i in album*
do
    mp3wrap "${i}.mp3" "${i}"/*.mp3
done

变量和参数几乎应该总是被引用以避免您的第一个问题。相反,shell globing 字符喜欢*?不应该,否则它们就会失去其特殊含义。

相关内容