在jq中将值赋值为变量

时间:2017-12-04 17:09:21

标签: json bash jq

对于package.json

json processor jq

{
  "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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-1)

需要明确的是:使用OP的方法可以起作用,例如

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

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