使用jq向JSON插入新键时如何正确传入变量值?
问题原因
你用单引号包裹了整个jq脚本,shell不会解析单引号内部的变量引用,所以$SHORT_NAME被当作字面字符串直接写入了JSON,没有替换成实际的变量值。
解决方法
推荐两种可靠的处理方式:
方法1:使用jq的--arg参数(优先选择)
这是jq官方推荐的传递外部变量的方式,能避免字符串转义、特殊字符处理等问题,更安全稳定:
# 用$(...)代替反引号,可读性更好 SHORT_NAME=$(jq -r '.properties.cluster_name' filepath) # 用--arg定义jq内部变量,再在脚本中引用 jq --arg short_val "$SHORT_NAME" '.properties.short_name = $short_val' filepath
--arg short_val "$SHORT_NAME"会把shell变量SHORT_NAME的值赋值给jq内部的$short_val变量,之后在jq脚本里直接引用这个变量即可。
方法2:调整shell引号拼接
如果不想用--arg,可以拆分引号,让shell解析变量部分:
SHORT_NAME=$(jq -r '.properties.cluster_name' filepath) jq '.properties += { "short_name": "'"$SHORT_NAME"'" }' filepath
这里把jq脚本拆成三段拼接:
- 单引号包裹的
.properties += { "short_name": "' - 双引号包裹的
$SHORT_NAME(让shell解析变量) - 单引号包裹的
'" }'
拼接后shell会先替换$SHORT_NAME为实际值,再传给jq处理。
正确结果示例
执行后JSON会变成:
{ "properties": { "cluster_name": "abc-test-00", "short_name": "abc-test-00" } }
内容的提问来源于stack exchange,提问作者Bokambo
相关产品推荐
相关产品推荐

