如何将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执行,所以body和statusCode变量能直接被后续命令使用。
为什么你原来的写法不行?
你之前的代码里,body=$(</dev/stdin)和statusCode=$(</dev/stdin)都是在独立的子shell里运行的,这些变量只在各自的子shell里有效,父shell完全访问不到,所以最后echo的时候输出是空的。
备注:内容来源于stack exchange,提问作者Richard Barraclough




