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

如何在jq中转义变量newValue以替换含点号的JSON键对应值?

解决jq替换带点键下的version值时变量未解析的问题

要解决这个问题,核心是两点:正确访问带点的JSON键,以及安全传递Shell变量给jq,具体方法如下:

1. 访问带点键的正确语法

JSON中带点的键(比如two.two)不能直接用.two.two访问(这会被jq解析为two对象下的two子键),必须用以下两种方式之一:

  • 引号包裹键名:."two.two"
  • 数组索引语法:["two.two"]

2. 安全传递Shell变量给jq

直接在jq脚本里写$newvalue会因为引号问题导致变量无法被Shell解析,最稳妥的方式是用jq的--arg参数将Shell变量传入jq环境:

示例脚本

假设你的JSON文件为data.json,内容如下:

{
  "one": {
    "version": "0.0.1"
  },
  "two.two": {
    "version": "0.0.2"
  }
}

执行以下命令即可完成替换:

# 定义Shell变量
newvalue="1.2.3"

# 使用jq替换指定键下的version值
jq --arg newver "$newvalue" '."two.two".version = $newver' data.json

直接修改原文件(可选)

如果需要直接修改原JSON文件(jq 1.5及以上版本支持),添加-i选项:

jq -i --arg newver "$newvalue" '."two.two".version = $newver' data.json

为什么之前的方法无效?

  • 用单引号包裹jq脚本时,Shell不会解析脚本内的$newvalue,直接将其作为字符串传递给jq;
  • 用双引号包裹jq脚本时,虽然Shell会解析变量,但带点的键名容易引发语法冲突,且存在注入风险;
  • 使用--arg参数可以将Shell变量安全传入jq,完全避免引号转义和变量解析的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:05:17