Shell脚本实现循环调用curl直至URL请求成功的方案咨询
实现URL自动重试请求的Shell脚本方案
你的嵌套循环思路完全可行,用while读取文件中的每个URL,再用until循环对单个URL重复请求直到成功,是非常直接的解决方案。以下是具体实现和优化建议:
基础版脚本
#!/bin/bash # 读取URL文件,逐行处理每个URL while IFS= read -r url; do # 跳过文件中的空行 [[ -z "$url" ]] && continue echo "开始处理URL: $url" # 循环请求直到curl返回成功 until curl -s -f "$url"; do echo "请求$url失败,10秒后重试..." sleep 10 # 可根据需要调整重试间隔 done echo "$url 请求成功,继续处理下一个URL" done < "sample.txt"
关键参数说明
IFS= read -r url:确保正确读取每行内容,保留URL中的特殊字符,避免因空格或换行截断内容curl -s -f:-s启用静默模式,不输出冗余的连接信息;-f让curl在HTTP状态码为非200时返回非零退出码,这样until能准确识别请求失败sleep 10:添加重试间隔,避免短时间内频繁请求给目标服务器造成压力,可根据实际情况调整时长
带重试次数限制的优化版
如果不想无限重试(比如遇到无效URL时),可以添加最大重试次数限制:
#!/bin/bash max_retries=10 # 设置最大重试次数 input_file="sample.txt" while IFS= read -r url; do [[ -z "$url" ]] && continue echo "开始处理URL: $url" retry_count=0 # 循环请求,直到成功或达到最大重试次数 until curl -s -f "$url" || (( retry_count >= max_retries )); do (( retry_count++ )) echo "请求$url失败,第$retry_count次重试(最多$max_retries次),10秒后重试..." sleep 10 done if (( retry_count >= max_retries )); then echo "$url 达到最大重试次数,放弃请求" else echo "$url 请求成功" fi done < "$input_file"
这个方案完全符合你的需求,嵌套循环的逻辑清晰易维护,也能灵活扩展功能(比如添加日志、调整重试策略等)。
内容的提问来源于stack exchange,提问作者Nitin Kumar
相关产品推荐
相关产品推荐

