终端执行命令正常,脚本运行后tracks文件为空,求排查原因
脚本执行后tracks文件为空的问题排查
1. while循环重定向错误(核心原因)
你的脚本中,while read a b; do ... done > $dj_name-tracks 这一行是将循环输出写入到目标文件,会直接覆盖之前grep生成的$dj_name-tracks内容,同时循环没有指定输入源,read无法读取到任何链接,最终导致文件被清空。
正确写法应该是用<读取已生成的tracks文件:
while read a b; do wget --user-agent=Mozilla/5.0 --save-cookies cookies.txt --post-data 'dir="$dir1"=&file="$file1"' --no-check-certificate "$a" "$b" done < $dj_name-tracks
2. 首次wget未指定User-Agent,页面返回内容不一致
脚本中第一次执行wget时没有设置--user-agent参数,hearthis.at可能会对Wget默认的User-Agent返回不含mp3链接的简化页面。而你在终端执行时,可能使用了浏览器的UA或已有相关配置,导致页面内容不同。
需要给首次wget也添加UA:
wget --user-agent=Mozilla/5.0 https://hearthis.at/$dj_name/podcast/ -O $dj_name
3. 正则表达式匹配不严谨
你使用的grep正则"(https)://[a-zA-Z0-9./?=_%:-]*.mp3*"存在两个问题:
.mp3*表示匹配.mp后接0个或多个3,无法精准匹配.mp3结尾的链接- 字符集中的
-未转义或放在末尾,可能被解析为字符范围(虽然当前场景可能不报错,但不够严谨)
修改后的正则:
grep -Eo "https://[a-zA-Z0-9./?=_%:-]*\.mp3" | sort -u > $dj_name-tracks
如果要强制匹配链接结尾,可改为:
grep -Eo "https://[a-zA-Z0-9./?=_%:-]*\.mp3$" | sort -u > $dj_name-tracks
4. 变量未加引号,存在特殊字符风险
若输入的dj_name包含空格、&等特殊字符,脚本会直接报错。需给所有变量添加双引号:
mkdir "$dj_name" cd "$dj_name" wget --user-agent=Mozilla/5.0 "https://hearthis.at/$dj_name/podcast/" -O "$dj_name" cat "$dj_name" | grep -Eo "https://[a-zA-Z0-9./?=_%:-]*\.mp3" | sort -u > "$dj_name-tracks" while read a b; do wget --user-agent=Mozilla/5.0 --save-cookies cookies.txt --post-data 'dir="$dir1"=&file="$file1"' --no-check-certificate "$a" "$b" done < "$dj_name-tracks"
内容的提问来源于stack exchange,提问作者Roberto Gonzalez
相关产品推荐
相关产品推荐

