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

1 bash wildcards whitespace variable-substitution

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

mp3wrap album\ 1.mp3 album\ 1/*.mp3
Run Code Online (Sandbox Code Playgroud)

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

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

for i in album*
do
  mp3wrap $i.mp3 $i/*.mp3
done  
Run Code Online (Sandbox Code Playgroud)

但我得到了错误

1.mp3: No such file or directory
Run Code Online (Sandbox Code Playgroud)

似乎我的脚本将 $i 扩展为“album 1.mp3”,它作为两个单独的参数传递。经过一些搜索和阅读,我最终得到了这个:

for i in album*
do
  mp3wrap "${i}.mp3" "${i}/*.mp3"
done  
Run Code Online (Sandbox Code Playgroud)

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

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

xhi*_*nne 5

你已经接近它了。这是正确的代码:

for i in album*
do
    mp3wrap "${i}.mp3" "${i}"/*.mp3
done
Run Code Online (Sandbox Code Playgroud)

变量和参数应该几乎总是被引用以避免你的第一个问题。相反,外壳globing人物像*?不应该,否则他们失去了特殊的意义。