Shell脚本新手求助:从列表文件用curl批量获取网页HTTP状态码
帮你修正并优化Shell脚本~
嘿,作为Shell新手碰到这种小问题很正常,我帮你梳理下原脚本的问题,再给你一个更可靠的版本:
原脚本的几个核心问题
- 读取CSV的方式错误:
read -ra arr_values <<< $(head -n 999 web.csv)会把所有行的内容按空格拆分到数组里,如果你的web.csv是每行一个网站,这个操作会把换行符当成空格,导致数组里的元素可能不是完整的网址(比如带路径的网址会被拆碎)。 - 变量未加引号:
curl里的$s没加双引号,要是网址里有&、空格这类特殊字符,Shell会直接解析出错。 - 语法不完整:
if语句最后没有闭合的fi,运行时会直接报错。 - 输出无上下文:只打印
OK/Er...,你根本不知道对应哪个网站出了问题。
修正后的完整脚本
#!/bin/bash # 逐行读取web.csv的前999行,每行对应一个网站 while IFS= read -r site; do # 跳过空行,避免无效的curl请求 [[ -z "$site" ]] && continue # 执行curl获取HTTP状态码,给site加双引号确保特殊字符被正确处理 # 可以加--max-time 10设置超时时间,避免卡住 res=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$site") # 判断状态码,同时输出网站名称和具体状态码,方便排查 if [[ "$res" == "200" || "$res" == "302" ]]; then echo "$site - OK (状态码: $res)" else echo "$site - 异常 (状态码: $res)" fi done < <(head -n 999 web.csv)
关键修改点说明
- 用
while read循环读取每行:IFS= read -r site可以完美保留每行的原始内容,不会截断开头空格,也不会转义反斜杠。 - 跳过空行:避免CSV里的空行触发无效的curl请求。
- 安全引用变量:
"$site"确保带特殊字符的网址能被curl正确识别。 - 更清晰的输出:同时打印网站地址和状态码,一眼就能看出哪个站点有问题。
- 可选超时设置:
--max-time 10让curl在10秒后自动超时,避免脚本被某个卡住的请求拖死。
额外小建议
- 如果你的网站都是HTTPS,碰到证书验证失败的情况,可以临时加
-k参数忽略证书(生产环境不推荐)。 - 如果需要把结果保存到文件,直接在脚本最后加
>> result.log即可:done < <(head -n 999 web.csv) >> result.log
内容的提问来源于stack exchange,提问作者KimSondergaard
相关产品推荐
相关产品推荐

