使用jq通过变量指定JSON路径更新值时运行报错如何解决?
jq 传入路径变量更新JSON值问题解决方案
报错原因
使用--arg传入的变量默认是字符串类型,jq不会将其解析为JSON路径表达式,只会当作普通字面量处理,因此直接对$p执行赋值操作会触发路径无效的报错。
可行解决方案
方案1:直接拼接shell变量(简单场景优先)
如果路径字符串是固定可控的,直接将变量拼接到jq的表达式参数中即可,写法如下:
KEY='.Resources.lc.Properties.UserData."Fn::Base64"' jq "$KEY = \"HHH\"" my_data.json
注意如果赋值内容也用变量存储,需要处理好引号转义避免解析错误。
方案2:使用路径数组+setpath(更安全,推荐)
如果需要规避注入风险,可将路径转为JSON数组格式,用--argjson传入后调用setpath方法赋值:
# 路径写为数组格式,每一级路径为数组的一个元素 KEY='["Resources", "lc", "Properties", "UserData", "Fn::Base64"]' jq --argjson p "$KEY" 'setpath($p; "HHH")' my_data.json
方案3:动态解析路径字符串
如果你必须保留原有点分隔的路径字符串写法,可调用jq的eval函数动态解析路径:
KEY='.Resources.lc.Properties.UserData."Fn::Base64"' jq --arg p "$KEY" --arg val "HHH" 'eval("\($p) = \($val|@json)")' my_data.json
注意:
eval存在代码注入风险,仅在路径完全可控的场景下使用。
内容的提问来源于stack exchange,提问作者Nate Marks
相关产品推荐
相关产品推荐

