bash脚本中参数过多错误

bash脚本中参数过多错误,bash,shell,Bash,Shell,我已修改此脚本以从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 Sorr

我已修改此脚本以从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\u 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

始终引用参数展开式。
$video\u title
的值被拆分为多个单词,这会混淆
[
命令

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

每当需要调试shell脚本时,请使用
set-xv
。这将打开详细模式,打印执行的每一行,并打开xtrace,在扩展完成时显示命令

您可以使用
set+xv
关闭
set-xv
。您可以封装整个脚本,也可以只封装引起您心痛的行

如果您这样做,我想您会看到,
$video\u title
被扩展为带有空格的名称,这时您就会出现错误。您应该在脚本中有“$video\u title”的地方加引号:

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

if test -f "$video_title".$ext2  #QUOTES!
then
与所有命令一样,shell将在空白处分解您为命令提供的参数。因此,标题“萝卜的生命”将分解为五个单独的参数“the”、“Life”、“of”、“a”和“Radish”,然后再传递到此
测试
命令

if [ -f "$video_title.$ext1" ]
then
     ffmpeg -i "$video_title.$ext1" ...
这解释了您的错误消息:

youtube2mp3.sh: line 31: [: too many arguments
因为
-f
命令行参数只能接受一个额外的参数,而不能接受shell传递给它的五个参数。引号可以防止shell将视频标题拆分为单独的参数,以显示
-f
标志

顺便说一下,打印出test(
$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
的内置命令。)

尝试在test命令中重复引用变量名。例如,
if[-f“$video\u title.$ext1”]
etcyou在
sh
中运行它,而不是在
bash
中运行。尝试更改它并返回报告。同时在url周围放置
,并使用它返回报告。这基本上是