【问题标题】:Passing a path ("key1.key2") from a bash variable to jq将 bash 变量中的路径(“key1.key2”)传递给 jq
【发布时间】:2020-07-24 23:07:47
【问题描述】:

我在访问 'jq' 中的 bash 变量时遇到问题。 下面的 sn-p 显示了我的 bash 循环,用于检查 Json 文件中是否缺少键。

#!/bin/sh
for key in "key1" "key2.key3"; do
  echo "$key"
  if ! cat ${JSON_FILE} | jq --arg KEY "$key" -e '.[$KEY]'; then
    missingKeys+=${key}
  fi
done

JSON_FILE:

{
  "key1": "val1",
  "key2": {
    "key3": "val3"
  }
}

该脚本适用于“key1”等顶级键。但是对于“key2.key3”,它不能正常工作(返回 null)。

命令行上的'jq'确实返回正确的值

cat input.json | jq '.key2.key3'
"val3"

我按照其他帖子的答案得出了这个解决方案。但是似乎无法弄清楚为什么它不适用于嵌套的 json 键。

【问题讨论】:

  • 您要求它在结构{ "key2.key3": "val3" } 中查找某些内容。这与您实际拥有的结构不同,因此它不起作用也就不足为奇了。
  • 顺便说一句,您是否有理由为每个键调用一次 jq,而不是让它在一次调用中处理所有可能的键?能够使用readarray -t missingKeys < <(jq ...) 会更有效率;一个逗号分隔的表达式列表将被逐个评估为单独的输出,这使得实现起来相当简单。
  • 或者,您可以告诉 jq 列出您的 json 文件 确实 包含的所有路径,然后使用 comm 或类似的方式查找存在于 a (presorted ) 预期列表,但不在该输出列表中。也就是说——许多不需要反复运行 jq 的替代方案。

标签: json bash jq


【解决方案1】:

使用--arg 可以防止您的数据被错误地解析为语法。通常,您传递给 jq 的 shell 变量包含文字数据,所以这是正确的。

在这种情况下,您的变量包含语法,而不是文字数据:. 不是您要查找的字符串的一部分,而是一条指令 jq 在其他。

所以,在这种情况下,你应该做更明显的事情,而不是使用--arg

jq -e ".$KEY"

【讨论】:

    猜你喜欢
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多