【发布时间】: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 的替代方案。