2013-07-15 125 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" ...