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

Bash脚本优化:curl连接失败时跳过当前IP进入下一轮循环

解决Bash脚本curl超时无限等待及跳转问题

核心问题分析

  • curl无超时限制:默认curl未设置超时,遇到连接超时会一直阻塞,导致脚本卡在当前IP无法继续。
  • 错误状态判断失效:链式命令中$?仅获取最后一个命令的退出码,无法捕获上游curl的错误;若第一个curl返回空,xargs不会执行后续curl,$?会误判为成功。
  • 行号变量逻辑错误:仅在curl成功时递增n,失败时行号重复,导致输出混乱。
  • 存在未定义变量:脚本末尾的$i未定义,属于无效输出。

修改后的脚本

#!/bin/bash
filename='ips.txt'
n=1
# 设置curl连接超时时间(单位:秒)
CURL_TIMEOUT=10

while read -r line; do
    # 跳过文件中的空行
    [[ -z "$line" ]] && continue

    echo "Line No. $n : $line"
    
    # 单独获取参数,捕获第一个curl的错误
    foo_value=$(curl --connect-timeout "$CURL_TIMEOUT" -s https://someaddress | jq -r '.[].foo.value')
    if [[ $? -ne 0 || -z "$foo_value" ]]; then
        echo "Failed to get valid foo value, skip $line"
        n=$((n+1))
        continue
    fi

    # 执行目标请求,设置超时并捕获连接错误
    curl --connect-timeout "$CURL_TIMEOUT" -s http://"$line":YYYY/foo -o "$line".json
    if [[ $? -ne 0 ]]; then
        echo "Connection timed out for $line, jump to next IP"
    else
        echo "Data fetched successfully for $line"
    fi

    # 无论成功失败,行号都递增
    n=$((n+1))
done < "$filename"

关键修改说明

  • 添加超时参数:通过--connect-timeout给curl设置连接超时时间,避免无限等待。
  • 拆分命令单独校验:将参数获取和目标请求拆分,分别捕获错误,确保任一环节失败都能及时跳转。
  • 修正行号递增逻辑:无论当前IP处理成功与否,都递增行号,保证输出的行号连续准确。
  • 处理空行:增加空行判断,避免对文件中的空行执行无效请求。
  • 变量安全引用:给$line等变量添加双引号,避免IP含特殊字符时出现命令解析错误。

内容的提问来源于stack exchange,提问作者Ziva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:55:26