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中的特殊字符,安全可靠。
完整执行步骤
- 先获取容器IP并拼接为目标URL:
# 替换为你自己的容器名称或ID CONTAINER_IP=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <你的容器名/ID>) NEW_ENV_URL="http://${CONTAINER_IP}:3000"
- 调用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
相关产品推荐
相关产品推荐

