推荐用 curl -w 直接获取状态码:status=$(curl -s -o /dev/null -w "%{http_code}" url),再用 if 或 case 判断分支;若必须用 grep -q,则解析 curl -i 输出的 http 状态行,注意末尾空格防误匹配。

grep -q 本身不能直接检测 HTTP 状态码,它只是静默搜索文本。要“在脚本中静默检测资源状态码并分支执行”,实际需要的是:发起 HTTP 请求 → 提取状态码 → 用 grep -q(或其他方式)判断 → 分支处理。下面给出清晰、可靠、可直接使用的方案。
核心思路:curl + grep -q 提取并匹配状态码
推荐使用 curl -I 获取响应头(轻量、快速),配合 -s -o /dev/null 静默,再用 grep -q 判断状态码是否存在或是否匹配预期:
- curl -I -s -o /dev/null -w '%{http_code}' URL 更简洁(直接输出状态码),但不依赖 grep
- 若坚持用 grep -q,则需解析
curl -I输出的HTTP/1.1 200 OK行
推荐写法:用 curl -w 直接获取状态码(最稳)
这是生产环境首选,无需 grep 解析,无兼容性风险:
status=$(curl -s -o /dev/null -w "%{http_code}" https://httpbin.org/status/200)
if [ "$status" = "200" ]; then
echo "✅ 资源可用"
# 执行成功分支逻辑
elif [ "$status" = "404" ]; then
echo "⚠️ 页面未找到"
# 处理 404
else
echo "❌ 请求失败,状态码:$status"
# 兜底处理
fi若必须用 grep -q:解析响应头中的状态行
适用于需同时检查多个响应头字段(如 Server、Content-Type)的场景:
response=$(curl -s -I https://httpbin.org/status/200)
if echo "$response" | grep -q "^HTTP/"; then
if echo "$response" | grep -q "^HTTP/.* 200 "; then
echo "✅ 状态码为 200"
elif echo "$response" | grep -q "^HTTP/.* 50[0-3] "; then
echo "❌ 服务端错误"
else
echo "❓ 其他状态码"
fi
else
echo "? 无有效 HTTP 响应(超时/拒绝连接)"
fi注意:grep -q "^HTTP/.* 200 " 中末尾空格可避免误匹配 2000、2001 等;^HTTP/ 确保匹配首行,防止响应体干扰。
增强健壮性:超时、重试与错误抑制
真实脚本中务必添加容错:
- 加 -m 5 设置 5 秒超时
- 加 --retry 2 --retry-delay 1 自动重试
- 重定向 stderr 到 /dev/null 避免 curl 错误信息输出(如证书警告)
status=$(curl -s -o /dev/null -m 5 --retry 2 --retry-delay 1 \
-w "%{http_code}" https://httpbin.org/status/200 2>/dev/null)
case $status in
200) echo "运行正常" ;;
401|403) echo "认证失败" ;;
50*) echo "后端异常" ;;
000) echo "连接失败(DNS/网络不通)" ;;
*) echo "未知状态:$status" ;;
esac不复杂但容易忽略:状态码 000 表示 curl 根本没发出请求(域名无法解析、网络不可达等),这比 5xx 更需优先告警。











