You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本中使用变量作为key通过jq读取Traefik API返回的JSON值

解决Bash变量传入jq作为key无法取值的问题

错误原因

  • 第一种写法jq -r '.serverStatus["${NEW_ENV_URL}"]'使用单引号包裹jq表达式,Bash不会解析单引号内的变量,jq实际收到的key是字面量${NEW_ENV_URL},自然匹配不到结果。
  • 第二种写法jq -r .serverStatus[$NEW_ENV_URL]既没有正确包裹jq表达式,也没有对作为key的字符串做转义,URL中的特殊字符会直接触发jq语法错误。

正确实现方案

推荐使用jq内置的--arg参数传递外部变量,该方式会自动处理字符串转义,不需要手动处理URL中的特殊字符,安全可靠。

完整执行步骤

  1. 先获取容器IP并拼接为目标URL:
# 替换为你自己的容器名称或ID
CONTAINER_IP=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <你的容器名/ID>)
NEW_ENV_URL="http://${CONTAINER_IP}:3000"
  1. 调用Traefik API并传入变量查询状态:
# 替换为你实际的Traefik API接口地址
curl -s <Traefik API地址> | jq -r --arg target_url "$NEW_ENV_URL" '.serverStatus[$target_url]'

验证示例

将你提供的JSON结构保存为traefik_response.json,执行以下命令测试:

NEW_ENV_URL="http://172.20.0.3:3000"
jq -r --arg target_url "$NEW_ENV_URL" '.serverStatus[$target_url]' traefik_response.json

正常输出结果为:

DOWN

注意:不推荐使用双引号包裹jq表达式直接替换变量的写法(如jq -r ".serverStatus[\"$NEW_ENV_URL\"]"),如果变量中包含双引号、反斜杠等特殊字符时会出现语法错误,--arg是官方推荐的变量传递方式。


内容的提问来源于stack exchange,提问作者Samuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:45:06