【问题标题】:jq: error: test1/0 is not defined at <top-level>, line 1jq:错误:test1/0 未在 <top-level> 第 1 行定义
【发布时间】:2018-12-07 13:36:38
【问题描述】:

我在下面的 JSON 文件中尝试在 shell 中动态地向数组添加值时遇到错误。

下面是一个tmp.json文件,

{
  "environments": {
    "integration": [
      "testing for jenkins job"
    ],
    "prod": [],
    "staging": [],
    "uat": []
  }
}

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

各自的输出是,

{
  "environments": {
    "appbuild": [],
    "integration": [
      "testing for jenkins job",
      "test1"
    ],
    "prod": [],
    "staging": [],
    "uat": []
  }
 }

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

export Environment_Name="integration"
jq ".environments."\"${Environment_Name}"\" += test1" tmp.json

我得到的错误是,

jq: error: test1/0 is not defined at <top-level>, line 1:
.environments."integration" += test1
jq: 1 compile error

谁能帮忙解决这个问题。

【问题讨论】:

    标签: shell jq


    【解决方案1】:

    你有一些额外的引号,test1 必须是 ["test1"]

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

    【讨论】:

    • 非常感谢!我像这样使用 jq .[\"start-time\"]
    • 我刚刚发现,由于某种原因,在 Powershell 中的 Windows 10 上,即使在单引号中,我们也需要转义双引号,例如如果没有反斜杠,这将不起作用(注意 curl.exe 是通过 Chocolatey 安装的):curl.exe -s https://api.github.com/repos/alerque/libertinus/releases/latest | jq -r '.assets[] | select(.content_type == \"application/zip\").browser_download_url'。奇怪。
    【解决方案2】:

    使用基于 shell 的变量插值通常是一个非常糟糕的主意。在本例中,例如,如果 shell 变量包含双引号怎么办?

    安全的做法是酌情使用env 或--arg 或--argjson,例如

    jq --arg e "${Environment_Name}" '.environments[$e] += ["test1"]'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2019-08-09
      相关资源
      最近更新 更多