2013-07-15 138 views
6

我已經修改了這個腳本從YouTube下載歌曲,但我收到以下錯誤,當我運行它是這樣的:參數太多錯誤

sh youtube2mp3.sh https://www.youtube.com/watch?v=gpOJ6iu8fqQ 

錯誤:

youtube2mp3.sh: line 31: [: too many arguments 
youtube2mp3.sh: line 39: [: too many arguments 
youtube2mp3.sh: line 49: [: too many arguments 
Sorry but the system encountered a problem. 

行號指的是三個if [ -f $video_title.$ext1 ]線...我想我的觀點確定,因爲它在以前版本的工作,但我被困在這一點上 - 可能有人解釋我需要做什麼來糾正它?

address=$1 

video_title="$(python youtube-dl $address)" 

ext1="flv" 
ext2="mp4" 
ext3="webm" 



if [ -f $video_title.$ext1 ] 
then 
    ffmpeg -i $video_title.$ext1 "$video_title".wav 
    lame "$video_title".wav "$video_title".mp3 
    rm $video_title.$ext1 "$video_title".wav 
else 
    if [ -f $video_title.$ext2 ] 
    then 
     ffmpeg -i $video_title.$ext2 "$video_title".wav 
     lame "$video_title".wav "$video_title".mp3 
     rm $video_title.$ext2 "$video_title".wav 
    else  
     if [ -f $video_title.$ext3 ] 
     then 
      ffmpeg -i $video_title.$ext3 -acodec libmp3lame -aq 4 "$video_title".mp3 
      rm $video_title.$ext3 
     else 
      echo "Sorry but the system encountered a problem." 
     fi 

    fi 
fi 
+6

嘗試雙引號測試命令中的變量名稱。例如'如果[-f「$ video_title。$ ext1」]'等 – user000001

+1

你用'sh'而不是'bash'運行它。嘗試改變它並報告回來。還把''''放在你的網址周圍,然後報告。 – mnagel

+0

這基本上是https://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-shell-variable的副本 – tripleee

回答

6

無論何時您需要調試一個shell腳本,請使用set -xv。這將開啓詳細模式,其將打印出所執行的每個線,並且將導通X跟蹤當膨脹完成,這將顯示命令。

您可以set +xv關閉set -xv。你可以將你的整個劇本,或者只是引起你的心痛的線條包裹起來。

如果你這樣做,我想你會看到$video_title被擴大到名字包含空格,當你得到你的錯誤,這就是。你應該在你的腳本到處都可以把報價,你有`$ VIDEO_TITLE「:

if [ -f "$video_title".$ext2 ] #QUOTES! 
then 
    ffmpeg -i "$video_title".$ext2 "$video_title".wav #EVEN MORE QUOTES 

記住[實際上是一個命令,是一個同義詞的test命令你if命令可以寫成:

if test -f "$video_title".$ext2 #QUOTES! 
then 

像所有的命令,shell將打破你給的白色空間的命令的參數。因此,你的標題「蘿蔔的生活」將得到分解爲五個獨立的參數「的」「生活」「的」「一」「蘿蔔」之前被傳遞給這個test命令。

這說明你的錯誤信息:

youtube2mp3.sh: line 31: [: too many arguments 

由於-f命令行參數只能取一個附加參數,而不是五個參數外殼傳遞給它。引號使shell不會將您的視頻標題分解爲-f標誌的單獨參數。

順便說一句,打印出來的手冊頁上測試$ man test),你會看到,它需要所有的參數相同的[ ... ]服食。它還解釋了爲什麼[]需要被空格包圍 - 這些是Unix命令,Unix命令必須被空格包圍。

而且運行此命令:

$ ls -il /bin/[ /bin/test 
10958 -rwxr-xr-x 2 root wheel 18576 May 28 22:27 /bin/[ 
10958 -rwxr-xr-x 2 root wheel 18576 May 28 22:27 /bin/test 

即第一個參數是的inode。它有點像文件的真實名稱(你認爲文件名和目錄是inode的屬性)。您會看到test[具有相同的inode編號,因此它們實際上是相同的文件(通過ln命令)鏈接到同一個文件。

(並非完全如此。該[是內置命令既Korn和BASH,你很可能使用。但是,[內建命令內部連接到另一個內置命令調用test反正。)

8

總是引用參數擴展。 $video_title的值被拆分爲多個單詞,這會混淆[命令。

if [ -f "$video_title.$ext1" ] 
then 
    ffmpeg -i "$video_title.$ext1" ...