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 脚本执行时实际命令行的样子。
我究竟做错了什么?任何帮助表示赞赏!
你已经接近它了。这是正确的代码:
for i in album*
do
mp3wrap "${i}.mp3" "${i}"/*.mp3
done
Run Code Online (Sandbox Code Playgroud)
变量和参数应该几乎总是被引用以避免你的第一个问题。相反,外壳globing人物像*和?不应该,否则他们失去了特殊的意义。