如何在终端读取歌曲名并从YouTube下载MP3及脚本故障排查
解决YouTube MP3下载脚本的问题
嘿,我来帮你搞定这个从YouTube下载MP3的脚本问题!你现在的脚本主要有几个小问题:curl的搜索URL拼接错误、youtube-dl的命令语法混乱,还有循环里的路径和引号逻辑不对。我给你整理了两种可行的方案,一种用命令行传参,一种用read命令让你直接输入歌曲名,按需选就行。
方案一:通过命令行参数传入歌曲名
这种方式适合你习惯在启动脚本时直接带上歌曲名的场景,比如 ./script.sh 夜曲 周杰伦。
先看修正后的完整脚本:
#!/bin/bash # 检查是否传入了歌曲名参数 if [ $# -eq 0 ]; then echo "请传入要搜索的歌曲名,比如:./script.sh 夜曲 周杰伦" exit 1 fi # 把所有参数拼接成搜索关键词,空格替换为+(YouTube搜索的格式要求) search_query=$(echo "$*" | tr ' ' '+') # 构造YouTube搜索页面的URL search_url="https://www.youtube.com/results?search_query=${search_query}" # 提取搜索结果里第一个视频的链接(如果要多个可以调整grep和cut的逻辑) video_link=$(curl -s "$search_url" | grep -o 'href="/watch[^"]*"' | cut -d'"' -f2 | head -n1) # 检查是否找到视频链接 if [ -z "$video_link" ]; then echo "没找到对应歌曲的视频链接,请检查歌曲名是否正确" exit 1 fi # 使用youtube-dl下载并转换为MP3,保存到指定目录 youtube-dl -x --audio-format mp3 "https://www.youtube.com${video_link}" -o "/home/viacheslav/IdeaProjects/untitled/untitled/%(title)s.%(ext)s" echo "MP3下载完成,保存路径:/home/viacheslav/IdeaProjects/untitled/untitled/"
关键修正点:
- 把所有命令行参数拼合成搜索关键词,用
tr ' ' '+'替换空格为+,符合YouTube搜索URL的格式 - 正确构造搜索URL,避免原脚本里
${1} ${2}的错误拼接 - 用
grep -o精准提取视频链接,原脚本的grep匹配规则不够准确 - 给youtube-dl指定了清晰的输出路径和文件名格式,修复了原脚本路径写在URL后的语法错误
- 增加了参数检查和错误提示,让脚本更健壮
方案二:用read命令让用户输入歌曲名(无需传参)
如果你不想每次启动脚本都带参数,这种方式更友好,启动后直接输入歌曲名就行。
完整脚本如下:
#!/bin/bash # 提示用户输入歌曲名 echo "请输入要下载的歌曲名:" read -r song_name # 检查是否输入了内容 if [ -z "$song_name" ]; then echo "你还没输入歌曲名呢!" exit 1 fi # 转换搜索关键词格式 search_query=$(echo "$song_name" | tr ' ' '+') search_url="https://www.youtube.com/results?search_query=${search_query}" # 提取视频链接 video_link=$(curl -s "$search_url" | grep -o 'href="/watch[^"]*"' | cut -d'"' -f2 | head -n1) if [ -z "$video_link" ]; then echo "没找到对应歌曲的视频链接,请检查歌曲名是否正确" exit 1 fi # 下载并转换MP3 youtube-dl -x --audio-format mp3 "https://www.youtube.com${video_link}" -o "/home/viacheslav/IdeaProjects/untitled/untitled/%(title)s.%(ext)s" echo "MP3下载完成,保存路径:/home/viacheslav/IdeaProjects/untitled/untitled/"
使用说明:
- 给脚本添加执行权限:
chmod +x script.sh - 启动脚本:
./script.sh - 按照提示输入歌曲名,回车后就会自动下载啦
注意:如果你的系统里用的是yt-dlp(youtube-dl的替代工具,现在更常用),只需要把脚本里的youtube-dl换成yt-dlp就行,参数是完全兼容的。
内容的提问来源于stack exchange,提问作者Slavko Oleksiuk
相关产品推荐
相关产品推荐

