Bash

從 bash 腳本將路徑和文件名傳遞給程序

  • August 15, 2017

我使用一個名為 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 腳本執行時實際命令行的樣子。

我究竟做錯了什麼?任何幫助表示讚賞!

你離它很近。這是正確的程式碼:

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

幾乎總是應該引用變數和參數以避免您的第一個問題。相反,shell globing 字元喜歡*?不應該,否則它們就失去了特殊意義。

引用自:https://unix.stackexchange.com/questions/386282