(再次)什么';youtube dl自动下载bash脚本有什么问题
前一段时间,我问我正在尝试的bash脚本有什么问题,我得到了一个很好的解决方案: 我不断修改脚本以使用不同的youtube dl命令组合,并处理我的非常不稳定的互联网连接(这就是while/do循环的原因),它一直工作正常,但当我尝试使用相同的脚本结构从列表中的特定项目(例如:项目编号15)开始下载Youtube播放列表时,我遇到了一个错误。我仍然是bash脚本的新手(显然),所以我不知道出了什么问题 所讨论的脚本如下:(再次)什么';youtube dl自动下载bash脚本有什么问题,bash,youtube-dl,Bash,Youtube Dl,前一段时间,我问我正在尝试的bash脚本有什么问题,我得到了一个很好的解决方案: 我不断修改脚本以使用不同的youtube dl命令组合,并处理我的非常不稳定的互联网连接(这就是while/do循环的原因),它一直工作正常,但当我尝试使用相同的脚本结构从列表中的特定项目(例如:项目编号15)开始下载Youtube播放列表时,我遇到了一个错误。我仍然是bash脚本的新手(显然),所以我不知道出了什么问题 所讨论的脚本如下: #!/bin/bash function video { youtube
#!/bin/bash
function video {
youtube-dl --no-warnings -o '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s' --socket-timeout 15 --hls-use-mpegts -R 64 --fragment-retries 64 --prefer-free-formats --all-subs --embed-subs -f 'bestvideo[height<=720]+bestaudio/best[height<=720]' "$@"
}
read -p "url: " url
video "$url"
while [ $? -ne 0 ]; do sleep 5 && video "$url" ; done
clear && echo completed!
#/bin/bash
功能视频{
youtube dl--无警告-o%%(播放列表)s/%(播放列表索引)s-%(标题)s.%(ext)s'--套接字超时15--hls使用mpegts-R 64--片段重试64--首选自由格式--所有子项--嵌入子项-f'最佳视频[高度在bash中,命令开头的字符“-”用于设置选项,如果要打印--播放列表…
则应使用转义字符“\”
尝试类似于printf“\-\-播放列表…”的内容。
更正:printf“%s”-播放列表…“已解决!
我的兄弟(一名“退休”程序员)花了一些时间来评估Bash脚本的工作原理,我们找到了一种使脚本工作更简单的方法,只需添加youtube dl命令和youtube URL作为参数
脚本有点变化,现在看起来是这样的:
#!/bin/bash
function video() {
youtube-dl --no-warnings -o '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s' --socket-timeout 15 --hls-use-mpegts -R 64 --fragment-retries 64 --prefer-free-formats --all-subs --embed-subs -f 'bestvideo[height<=720]+bestaudio/best[height<=720]' "$@"
}
video $@
while [ $? -ne 0 ]; do sleep 5 && video $@ ; done
clear && echo completed!
!/bin/bash
函数视频(){
youtube dl--无警告-o%%(播放列表)s/%(播放列表索引)s-%(标题)s.%(ext)s'--套接字超时15--hls使用mpegts-R 64--片段重试64--首选自由格式--所有子项--嵌入子项-f'最佳视频[高度更好的设计是接受任何选项和URL作为命令行参数。需要交互式I/O的脚本很难包含在更大的脚本中,而且通常更难使用(您失去了使用shell的制表符完成和命令行历史记录等功能)
!/bin/bash
#不要不必要地使用Bash-only语法来声明函数
#缩进代码
视频(){
youtube dl--没有警告\
-o“%(播放列表)s/%(播放列表索引)s-%(标题)s.%(分机)s”\
--套接字超时15--hls使用mpegts-R 64--片段重试64\
--更喜欢自由格式——所有子类——嵌入子类\
-f'bestvideo[Heights
--playlist start=15
应该是脚本的一个选项,而不是printf
或要在脚本的标准输入上打印的内容。其语法是printf“$url”| list720--playlist start=15
。|
之前的内容是一个独立的命令,您的脚本不知道。我尝试了您的建议,但仍然不起作用…例如:printfhttps://www.youtube.com/playlist?list=PLS1QulWo1RIYmaxcEqw5JhK3b-6rgdWO_124; list720——playlist start=15
您不想使用URL作为printf
格式字符串。此外,URL包含一些由shell解释的字符。请尝试printf“%s”https://...gdW0_“
。也就是说,将URL作为指定的%s
转换的参数,并将其放在单引号中。如果它包含单引号,则可以用\'
(引用反斜杠引号)。正确的解决方案是printf“%s”-playlist'
。如果OP坚持使用printf
(并学会引用字符串),那么OP通常应该使用格式sting作为第一个参数。很抱歉,@gcadiou的建议无效:printf\-\-playlist start=15https://www.youtube.com/playlist?list=PLS1QulWo1RIYmaxcEqw5JhK3b-6rgdWO|list720
此外,我可能不理解@tripleee的建议,但这也不起作用:printf'https://www.youtube.com/playlist?list=PLS1QulWo1RIYmaxcEqw5JhK3b-6rgdWO_'--playlist start=15'| list720
printf
的第一个参数是一个格式字符串。要打印带破折号的字符串,printf“%s”--string with dash'
如果您也要打印其他字符串,请将它们添加到格式字符串之后(格式字符串将重复,直到所有参数都用尽)。正如我在对问题的原始评论中所解释的,您实际上仍然不需要或不想这样做。两个建议:双引号引用$@
,因为有时它会对未引号引用的变量/参数引用做一些奇怪的事情。此外,您可以将循环简化为,直到视频“$@”;do sleep 5;done
。哦,我建议你指出一些常见的错误,比如缺少双引号。谢谢你,@gordon……现在,我还有一个问题(如果这个问题太“新手”……我甚至不知道如何用正确的语言解释自己):在你的简化循环建议中,Bash是如何“知道”的我想在“do sleep 5”之后重新调用视频“$@”部分?这就是till
循环(以及非常类似的while
循环)的工作方式。它运行till
和do
之间的位,如果失败,则执行do
和done
之间的部分,然后重试(从开始直到)直到它成功。(一个while
循环有相反的测试:它在测试部分成功时一直运行,即直到失败。)可能让你困惑的是,测试部分不仅仅是一个被动测试,它是一个实际的活动(事实上,它是你关心的活动);但是所有的测试实际上都是活动,这个比大多数都要活跃一点。是的,我想我理解了…我想!…如果我理解正确,我使用的是“while[$?-ne 0]”像“until”一样,当我使用“until”时,我不需要添加“[$?-ne 0]”,因为在这种情况下,“until”循环就是这样做的(或多或少)…无论如何,谢谢你的建议。我添加了双引号,并替换了
list720 --playlist-start=15 'https://www.youtube.com/playlist?list=PLS1QulWo1RIYmaxcEqw5JhK3b-6rgdWO_'
bash$ printf 'http://example.com/%7Efnord'
http://example.com/0.000000E+00fnord
bash$ printf '%s\n' 'http://example.com/%7Efnord'
http://example.com/%7Efnord
list720 <<<'http://example.com/%7Efnord'