Shell脚本使用cURL/wGet批量调用文件中URL仅最后一条生效如何解决?
问题原因与解决方案
第一个核心问题:你的代码未实际执行curl请求
你贴出的代码中curl命令前加了echo,这行代码的作用仅为将curl -f 对应URL的字符串写入日志文件,并不会真的发起curl请求。你手动复制日志里的命令能执行成功,恰好印证了这点:日志里存的是命令文本,不是curl的执行结果。
第二个常见问题:URL文件存在格式兼容问题
如果你确认实际运行的代码已经去掉了echo,还是只有最后一条URL能触发服务,大概率是你的URL文件是Windows编码格式,行尾使用\r\n作为换行符:
read命令读取每行内容时只会自动去掉行尾的\n,会保留不可见的\r(回车符),导致前两行的URL末尾多了特殊字符,curl无法识别正确的请求地址,自然不会触发对应服务- 通常文件的最后一行不会额外加换行符,所以读取到的最后一条URL没有多余字符,可以正常执行
修复方法
- 去掉curl前的
echo,同时优化读文件的写法避免子Shell问题,参考代码如下:
# 直接用输入重定向给while传文件,避免cat管道带来的子Shell问题 # read加-r参数避免自动转义URL里的特殊字符 while read -r vMyRow do # 变量加双引号避免URL里有空格/特殊字符时报错,2>&1将错误输出也写入日志方便排查 curl -f "$vMyRow" >> "${vMyLogFile}" 2>&1 done < "${vMyFile}"
- 如果修复后还是有问题,先将URL文件转成Unix格式清除多余的回车符:
dos2unix ${vMyFile} - 排查时可在循环内加入
printf "读取到的URL:%q\n" "$vMyRow",可打印出URL中的不可见字符,快速定位是否存在格式问题。
多次调用curl不需要提前做关闭或结束类操作,curl每次调用都是独立的进程,执行完成后会自动释放所有资源。
内容的提问来源于stack exchange,提问作者Adriano Bastos
相关产品推荐
相关产品推荐

