You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:42:10