我需要全面支持变量以将更改推送到JSON
changeField=.one.aaa
changeValue=new-val
这有效:
jq --arg changeValue $changeValue ".one.aaa = \"$changeValue\"" some.json
这不是:
jq --arg changeField $changeField --arg changeValue $changeValue "$changeField = \"$changeValue\"" some.json
我已经尝试过[{(
的所有组合,但Google都没有显示。我在这里想念什么?
答案 0 :(得分:0)
这意味着让JQ将您的changeField
内容解析为代码;确保它来自受信任的来源。 (相反,changeValue
只是作为代码中的带外数据传递的,无论其内容如何,都可以防止注入攻击。)
inputJson='{"one": {"aaa": "old-val"}}'
changeField=.one.aaa
changeValue=new-val
jq --arg changeValue "$changeValue" "$changeField"'=$changeValue' <<<"$inputJson"
...正确发射:
{
"one": {
"aaa": "new-val"
}
}
inputJson='{".one.aaa": "old-val"}'
changeField=.one.aaa
changeVal=new-val
jq --arg changeField "$changeField" \
--arg changeValue "$changeValue" \
'.[$changeField]=$changeValue' <<<"$inputJson"
...正确发射:
{
".one.aaa": "new-val"
}
请注意,当我们通过jq --arg
传递参数时,我们在后面的查询中使用单引号对其进行引用,从而使对外壳的引用成为 literal 字符串,因此在语法上jq
。
相反,当我们希望数据(而不是对它的引用)与jq
语法化时,我们在外壳层将变量的扩展名用双引号传递,因此在解析jq
之前将其扩展了作为代码。