在jq中将值赋给变量

5

使用JSON处理器jq处理package.json文件。

{
  "someparent" : {
    "somechild" : "oldvalue"
  }
}

如果我运行以下命令(将oldvalue更改为somevalue):
jq '.someparent["somechild"] = "somevalue" "$aDirection/package.json"'

修改成功。但如果我使用一个变量而不是someValue

 aVar="anotherValue"
 jq '.someparent["somechild"] = "$aVar" "$aDirection/package.json"'

它不起作用。 我已经尝试过的:

["aVar"] #interpreted as string
["$aVar"] #interpreted as string
"$aVar" # aVar is not defined
$avar #aVar is not defined

我看过那个问题,但它们的答案不适用于这种情况,也不起作用(例如 \"aVar\")。 - Asqan
1
@BenjaminW。对于一个专家用户来说,这个问题可能看起来像是重复的,但对于初学者来说绝对不是。无论是类型、解决方案还是处理方法都不同。另外,正如你所说,JSON只是有一些简化的问题。 - Asqan
2个回答

7

在您的尝试中,jq筛选器周围的单引号放错了位置。它还将实际的JSON文件输入包含在内。在对文件应用过滤器时,正确的语法是:

jq '<filter>' json-file

在你的情况下,正确的过滤器只是
.someparent["somechild"] = $aVar

要在 jq 中使用 shell 变量,需要使用 --arg 字段。将两个选项组合在一起。在 --arg 后的第一个变量用于 jq 的上下文环境,而其后的变量则是实际的 shell 变量。

aVar="anotherValue"
jq --arg aVar "$aVar" '.someparent["somechild"] = $aVar' "$aDirection/package.json"
#                                                    ^^^^ Remember the single quote 
#                                                    terminating here and not extended

2
只是为了明确:使用原帖作者的方法可以实现,例如:
jq '.someparent["somechild"] = "'"$aVar"'"' "$aDirection/package.json"

但是使用--arg(对于字符串)和/或--argjson要好得多。另一个用于环境变量的选项是使用jq函数env


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接