bash脚本中的参数错误太多

我已修改此脚本以从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
每当你需要调试shell脚本时,请使用set -xv.这将打开详细模式,该模式将打印出执行的每一行,并将打开xtrace,这将在扩展完成时显示命令.

您可以使用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

请记住[实际上是一个命令,并且是测试命令的同义词.你的if命令可以写成:

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

与所有命令一样,shell将分解您在空格上给命令的参数.因此,在传递给此测试命令之前,您的标题“萝卜的生命”将被分解为五个单独的参数“The”,“Life”,“of”,“a”和“Radish”.

这解释了您的错误消息:

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

因为-f命令行参数只能接受一个附加参数而不是shell传递给它的五个参数.引号使shell不会将您的视频标题分解为-f标志的单独参数.

顺便说一句,打印出测试的manpage($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的内置命令.但是,[builtin命令内部链接到另一个名为test的内置命令.)

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...