检查指定URL响应码的Bash脚本遍历完成后无法自动停止如何解决
卡顿原因
- 你写的循环逻辑存在错误:
for link incat $1$2这行把第二个参数(你传入的期望HTTP状态码)也加入了待请求的URL列表,所有文件内的URL处理完成后,curl会去请求状态码这个无效字符串(比如你传了200就会请求200这个不存在的地址),导致长期挂起。 - 没有给curl设置超时规则,遇到无法连接的URL会无限等待。
- 用
for遍历cat输出的写法兼容性差,遇到带特殊字符、空格的URL会拆分错误,也可能引发异常。
修复后的完整脚本
#!/bin/bash # 先校验参数合法性 if [ $# -ne 2 ]; then echo "用法:$0 <URL列表文件路径> <期望匹配的HTTP状态码>" echo "示例:$0 urls.csv 200" exit 1 fi url_file="$1" target_code="$2" # 逐行读取URL文件,兼容带特殊字符的URL、最后一行无换行的场景 while IFS= read -r link || [ -n "$link" ]; do # 跳过空行 [ -z "$link" ] && continue # curl增加连接超时和总请求超时,避免挂起 resp_code=$(curl --output /dev/null --silent --connect-timeout 3 --max-time 8 --write-out '%{http_code}' "$link") if [ "$resp_code" = "$target_code" ]; then echo "$link" fi done < "$url_file"
关键修改说明
- 删除了循环列表里的
$2参数,不会再把状态码当成URL请求 - 给curl增加了3秒连接超时、8秒总请求超时,极端情况也不会长期卡顿
- 用
while read逐行读取文件替代原for循环写法,兼容性更强,不会因为URL的特殊字符出现拆分错误 - 增加了参数校验,避免漏传参数时的异常运行
内容的提问来源于stack exchange,提问作者luknij
相关产品推荐
相关产品推荐

