gpt4 book ai didi

bash - bash 脚本中的参数错误太多

转载 作者:行者123 更新时间:2023-11-29 08:58:49 25 4
gpt4 key购买 nike

我已修改此脚本以从 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。这将打开 verbose 模式,它将打印出执行的每一行,并将打开 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

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

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

与所有命令一样,shell 会将您提供给命令的参数分解为空格。因此,您的标题“萝卜的生命”将分解为五个单独的参数“The”“Life”“of”“a”“Radish”,然后再传递给此 test 命令。

这解释了您的错误消息:

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。)

关于bash - bash 脚本中的参数错误太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17653050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com