jq:错误:在第1行的<top-level>中未定义test1 / 0

Gow*_*avi 7 shell jq

尝试在外壳中动态添加值到数组时,我在JSON文件下面遇到错误。

下面是一个tmp.json文件,

{
  "environments": {
    "integration": [
      "testing for jenkins job"
    ],
    "prod": [],
    "staging": [],
    "uat": []
  }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试将值附加到带有静态变量的数组时,它可以正常工作。下面是命令jq'.environments.integration + = [“ test1”]'tmp.json

各自的输出是,

{
  "environments": {
    "appbuild": [],
    "integration": [
      "testing for jenkins job",
      "test1"
    ],
    "prod": [],
    "staging": [],
    "uat": []
  }
 }
Run Code Online (Sandbox Code Playgroud)

而当我尝试动态附加值时,会引发错误。

export Environment_Name="integration"
jq ".environments."\"${Environment_Name}"\" += test1" tmp.json
Run Code Online (Sandbox Code Playgroud)

我得到的错误是,

jq: error: test1/0 is not defined at <top-level>, line 1:
.environments."integration" += test1
jq: 1 compile error
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助解决此问题。

Ste*_*fan 9

您那里有一些额外的报价,test1需要["test1"]

jq ".environments.${Environment_Name} += [\"test1\"]" tmp.json

  • 我刚刚发现,出于某种原因,在 Windows 10 的 Powershell 中,即使在单引号中,我们也需要转义双引号,例如,如果没有反斜杠,这将不起作用(请注意,`curl.exe` 是通过 [Chocolatey](https ://community.chocolatey.org/packages/curl)): `curl.exe -s https://api.github.com/repos/alerque/libertinus/releases/latest | jq -r '.assets[] | select(.content_type == \"application/zip\").browser_download_url'`。奇怪的。 (5认同)

pea*_*eak 5

使用基于shell的变量插值通常是一个非常糟糕的主意-例如,在当前情况下,如果shell变量包含双引号怎么办?安全的做法是根据需要使用env或--arg或--argjson,例如

jq —-arg e "${Environment_Name}" '.environments[$e] += ["test1"]'
Run Code Online (Sandbox Code Playgroud)