使用wget读取含$符号的URL下载时遇403错误的解决方法
解决bash脚本中wget下载含$符号URL的403错误
问题根源
你遇到的403错误主要来自两个问题:
- 脚本读取URL时的逻辑错误:原脚本既重复读取文件,又用错误的分隔符拆分URL行,导致传递给wget的是不完整的URL片段
- 直接在脚本中用双引号写URL时,bash会解析其中的
$somefile为变量(若未定义则为空),但从文件读取URL时,只要读取和传递方式正确,$不会被错误解析
正确脚本写法
方案1:逐行读取并下载(推荐)
直接读取文件的每一行作为完整URL,避免拆分:
while IFS= read -r url; do wget "$url" done < file.txt
IFS=:保证读取整行内容,包括开头/结尾的空格,不会按默认分隔符拆分read -r:禁止反斜杠转义,避免URL中的反斜杠被错误处理"$url":双引号包裹变量,确保URL中的$、&等特殊字符原样传递给wget,bash不会解析URL内部的$符号
方案2:用数组存储URL后批量下载
如果需要先存储所有URL再处理,用mapfile读取整行到数组:
mapfile -t urls < file.txt for url in "${urls[@]}"; do wget "$url" done
mapfile -t:将文件每行作为数组元素,自动去除行尾换行符,不会拆分URL"${urls[@]}":遍历数组时用双引号包裹,保证每个URL完整传递
原脚本错误分析
files=($(< file.txt)):会按空格、换行等分隔符拆分文件内容,若URL含特殊分隔符会被拆成多个片段while IFS='=| ' read -r param uri:用=、|、空格作为分隔符拆分每行,会截断URL,导致传递给wget的不是完整地址
内容的提问来源于stack exchange,提问作者Marcel Hoekstra
相关产品推荐
相关产品推荐

