Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 将路径(“key1.key2”)从bash变量传递到jq_Json_Bash_Jq - Fatal编程技术网

Json 将路径(“key1.key2”)从bash变量传递到jq

Json 将路径(“key1.key2”)从bash变量传递到jq,json,bash,jq,Json,Bash,Jq,我在访问“jq”中的bash变量时遇到问题。 下面的代码片段显示了检查Json文件中缺少的键的bash循环 #!/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

我在访问“jq”中的bash变量时遇到问题。 下面的代码片段显示了检查Json文件中缺少的键的bash循环

#!/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_文件:

{
  "key1": "val1",
  "key2": {
    "key3": "val3"
  }
}
对于顶级关键点(如“key1”),脚本可以正常工作。但是对于“key2.key3”,它不能正常工作(返回null)

命令行上的“jq”确实返回了正确的值

cat input.json | jq '.key2.key3'
"val3"
我根据其他帖子的答案得出了这个解决方案。但是,似乎无法理解为什么它不适用于嵌套的json键。

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

在本例中,您的变量包含语法,而不是文字数据:
不是您要执行查找的字符串的一部分,而是一条指令,指示jq逐个执行两个单独的查找

因此,在这种情况下,您应该做更明显的事情,而不是使用
--arg

jq -e ".$KEY"

您要求它在结构
{“key2.key3”:“val3”}
中查找某些内容。这与您实际拥有的结构不同,因此它不起作用也就不足为奇了。顺便问一下,您为什么要为每个键调用一次jq,而不是让它在一次调用中处理所有可能的键?使用
readarray-t missingKeys<会更有效率。另外,您可以告诉jq列出json文件确实包含的所有路径,然后使用
comm
或类似方法查找(预排序的)预期列表中的项,但不在该输出列表中。也就是说,有很多替代方案不需要反复运行jq。