You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将wget的响应内容与状态码赋值给变量?

如何将wget的响应内容与状态码赋值给变量?

嘿,我懂你想把wget返回的响应内容和HTTP状态码分别存到变量里的需求,你之前尝试的写法没成功,核心问题是进程替换里的变量作用域是子shell,父shell根本拿不到这些变量的值。我来给你两个实用的解决办法:

方案一:用临时文件中转(稳妥通用)

如果担心shell版本兼容性,用临时文件是最稳妥的方式,步骤清晰好理解:

# 创建临时文件存储服务器响应头
header_file=$(mktemp)

# 执行wget:把响应体输出到stdout(方便捕获到body变量),响应头输出到临时文件
body=$(wget https://www.google.com --quiet --server-response -O - 2>"$header_file")

# 从临时文件里提取最后一个HTTP状态码(避免重定向导致的多个状态码)
statusCode=$(grep HTTP "$header_file" | awk '{print $2}' | tail -n1)

# 验证结果
echo "响应体内容:$body"
echo "HTTP状态码:$statusCode"

# 清理临时文件,避免残留
rm "$header_file"

这个方案的思路是把响应头和响应体分开存储,先把响应头丢到临时文件,再从中提取状态码,响应体直接通过-O -输出到标准输出,方便直接捕获到变量里。

方案二:用进程替换+合并输出(无文件残留)

如果你的bash版本支持进程替换,也可以用这个不需要临时文件的写法,让变量直接在当前shell生效:

# 合并wget的stdout和stderr,传递给大括号内的命令(当前shell执行)
{
  body=$(cat)  # 读取所有响应体内容
  statusCode=$(grep HTTP | awk '{print $2}' | tail -n1)  # 提取最后一个状态码
} < <(wget https://www.google.com --quiet --server-response -O - 2>&1)

# 验证结果
echo "响应体内容:$body"
echo "HTTP状态码:$statusCode"

这里用2>&1把wget的标准错误(响应头)和标准输出(响应体)合并,然后通过< <(...)传递给大括号里的命令,大括号里的代码在当前shell执行,所以bodystatusCode变量能直接被后续命令使用。

为什么你原来的写法不行?

你之前的代码里,body=$(</dev/stdin)statusCode=$(</dev/stdin)都是在独立的子shell里运行的,这些变量只在各自的子shell里有效,父shell完全访问不到,所以最后echo的时候输出是空的。

备注:内容来源于stack exchange,提问作者Richard Barraclough

火山引擎 最新活动