使用jq解析含'-'字符键的JSON值及动态获取服务器地址
解决jq处理带特殊字符键及动态获取对应值的问题
一、读取含'-'的键值
当键名包含'-'这类特殊字符时,不能使用点语法(.list.foo-beta.host),必须用方括号+字符串的形式,同时要将整个jq表达式用单引号包裹,避免shell解析特殊字符。正确命令如下:
jq '.list["foo-beta"].host' test.json
如果需要输出不带引号的原始字符串,加上-r参数:
jq -r '.list["foo-beta"].host' test.json
你之前尝试的写法报错,大概率是因为没给jq表达式加单引号,导致shell把方括号等字符当成特殊语法解析了。
二、动态获取currentServer对应的host
有两种可靠的实现方式:
方式1:直接用jq内部逻辑完成(推荐)
不需要借助shell变量,直接在jq里用.currentServer的值作为键匹配,一步到位:
jq -r '.list[.currentServer].host' test.json
这种方式最简洁,也避免了shell变量传递时的转义问题。
方式2:通过shell变量传递(适合需要复用currentServer值的场景)
- 先获取currentServer的原始值(
-r参数确保输出不带引号):
CURR_SERVER=$(jq -r '.currentServer' test.json)
- 再用该变量获取对应host,推荐用jq的
--arg参数传递变量,避免shell转义问题:
CURR_SERVER_URL=$(jq -r --arg s "$CURR_SERVER" '.list[$s].host' test.json)
如果不用--arg,也可以用双引号包裹jq表达式让shell展开变量,但要注意转义内部的引号:
CURR_SERVER_URL=$(jq -r ".list[\"$CURR_SERVER\"].host" test.json)
内容的提问来源于stack exchange,提问作者WedaPashi
相关产品推荐
相关产品推荐

