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
相关产品推荐
相关产品推荐

