将值作为 jq 中的变量赋值

Asq*_*qan 5 bash json jq

package.json 的json 处理器 jq

{
  "someparent" : {
    "somechild" : "oldvalue"
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我运行以下命令(更改为oldvaluesomevalue

jq '.someparent["somechild"] = "somevalue" "$aDirection/package.json"'
Run Code Online (Sandbox Code Playgroud)

就修改成功了。但是,如果我给出一个变量而不是someValue

 aVar="anotherValue"
 jq '.someparent["somechild"] = "$aVar" "$aDirection/package.json"'
Run Code Online (Sandbox Code Playgroud)

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

["aVar"] #interpreted as string
["$aVar"] #interpreted as string
"$aVar" # aVar is not defined
$avar #aVar is not defined
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 7

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

jq '<filter>' json-file
Run Code Online (Sandbox Code Playgroud)

在你的情况下,正确的过滤器就是

.someparent["somechild"] = $aVar
Run Code Online (Sandbox Code Playgroud)

要在 中使用 shell 变量jq,您需要使用该--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
Run Code Online (Sandbox Code Playgroud)