如何在Bash脚本中使用JQ通过变量修改JSON文件?
问题根源
- 你使用单引号包裹jq的筛选表达式,Bash不会解析单引号内部的
$var变量,因此jq拿到的是字面量"$var",而非你定义的变量值 - 直接使用
>重定向回原文件cdk.json存在逻辑问题:Bash会优先执行重定向操作清空文件,再运行jq命令,最终大概率得到空文件 - 第二种写法额外嵌套了反引号和
$(),相当于把jq的输出结果又当作命令执行一遍,完全不符合需求
正确写法
方法1:通过jq的--arg参数传递变量(最稳妥,无转义风险)
这是官方推荐的变量传递方式,完全避免引号嵌套、特殊字符转义的问题:
var="test-54342" # 先写入临时文件再替换原文件,兼容所有jq版本 jq --arg new_val "$var" '.context["customer-name"] = $new_val' cdk.json > tmp.json && mv tmp.json cdk.json
如果你使用的是jq 1.6及以上版本,可以直接用-i参数原地修改文件,不用手动处理临时文件:
var="test-54342" jq --arg new_val "$var" -i '.context["customer-name"] = $new_val' cdk.json
方法2:双引号包裹jq表达式实现变量展开(不推荐,容易出现转义问题)
如果你一定要通过Bash直接展开变量,需要把jq表达式放在双引号内,同时转义内部的双引号:
var="test-54342" jq ".context[\"customer-name\"] = \"$var\"" cdk.json > tmp.json && mv tmp.json cdk.json
内容的提问来源于stack exchange,提问作者Sébastien Serre
相关产品推荐
相关产品推荐

