2014-10-29 65 views
1

我知道那裏已經有很多這樣的問題了,但是我的情況足夠獨特,以至於他們迄今都沒有幫助過我。將包含空格的shell變量作爲參數傳遞

我正在寫一個腳本,它會重新格式化我的(標記不佳的)音樂庫。它目前以Music/Genre/Artist/Album/## - Title.wav的形式出現。

從Music目錄中,我運行我的script1,它調用find -name "*.wav" -exec script2 {} ${other_args}。 Script2分析變量的路徑,創建適當的輸出目錄(如果它不存在),然後調用ffmpeg進行壓縮。

例如:($ sourcefilepath包含{}從FIND)

ffmpeg -i "$sourcefilepath" "$path/$to/$outfile.$extension" 

如果我的文件名或路徑不包含空格,它就像一個魅力。

如果它包含空格,ffmpeg的失敗,並出現以下錯誤:

Blues/Country Blues/Rhythm, Country And Blues/08-Natalie Cole & Reba McEntire Since I Fell For You.wav: No such file or directory

注:這是源文件無法找到。輸出文件似乎正常工作,即使有空格。這不是我正在運行的完整命令(它也有一些-metadata標誌,但是它也似乎正常工作,我正在用我上面寫的命令進行調試)。

這裏有趣的是ffmpeg不會將$ sourcefilepath解釋爲兩個參數,它只是找不到我指定的文件。從Music目錄運行以下內容。

ffmpeg -i Blues/Country\ Blues/Rhythm\,\ Country\ And\ Blues/08-Natalie\ Cole\ \&\ Reba\ McEntire\ \ \ Since\ I\ Fell\ For\ You.wav output.flac 

我有點卡在這裏。網絡上的其他信息涉及獲取命令以查看具有空格的變量作爲一個參數而不是多個參數。我似乎已經這樣做了,但ffmpeg現在找不到我的文件。

通常我只是使用find -name "*.wav" -exec ffmpeg -i {} ${args} \;,但我需要處理文件路徑來提取我的元數據。

我對shell腳本相當陌生;有人知道這裏發生了什麼嗎?

+1

您可以[刪除所有不重要的東西](http://stackoverflow.com/tags/bash/info)在腳本中,驗證它仍然存在相同的問題,並將其添加到您的問題? – 2014-10-29 17:24:12

回答

2

我的精神力量表明,在代碼中的某個時刻,你正在做的線沿線的東西:

something=$(echo $filename | something) 

這應該不是一直:

something=$(echo "$filename" | something) 

以下腳本演示爲什麼這是一個問題:

#!/bin/sh 
filename="Reba McEntire Since I fell"  
echo "$filename" # Correct, quoted 
echo $filename  # Incorrect, unquoted 

它輸出:

Reba McEntire Since I fell 
Reba McEntire Since I fell 

你會發現,

  • 第一行有三個空格藝術家後,在你正確的命令。
  • 第二行有一個空格之後的藝術家,如在你的錯誤信息。

這是由於經過分詞的未引用變量擴展。 echo然後將參數連接到單個空格。最終的結果是多個空白合併成一個空間。

+0

你的心靈力量是正確的;我將變量傳遞給sed並以這種方式剪切,以處理路徑。非常感謝! – 2014-10-29 18:48:47

+1

@JulianDelphiki爲了您的方便,[shellcheck](http://www.shellcheck.net)自動指出了這個和其他問題。 – 2014-10-29 20:06:51

相關問題