JQ - 收集项目数量并在 IF 语句中使用结果

JQ - Collect the amount of items and use the result in an IF sentence

提问人:Matias Barrios 提问时间:11/16/2023 更新时间:11/16/2023 访问量:39

问:

我在 JQ 中有一个表达式,如下所示:

[{  "names": .products[] | .name }]  |  length  > 200 as $qty |  if ($qty) then "ok" else "not ok" end

我假装在“qty”中保存一个布尔值。确实如此。但是当我添加 如果我没有得到语法错误,但我得到布尔值作为结果,而不是“ok”或“not ok”。

我做错了什么?

另外,如果我这样做:

 ( [{  "names": .products[] | .name }]  |  length  > 200 ) as $qty |  if ($qty) then "ok" else "not ok" end

为了提高表达式的可读性,我收到一个语法错误,告诉我有一个“意外的)符号”

JSON JQ

评论

0赞 Inian 11/16/2023
目前尚不清楚,您是想要一个/作为总和,还是想要每个满足条件的求和"ok""not ok"
3赞 pmf 11/16/2023
如果没有示例数据,很难进行测试,但您肯定在第一个代码段中缺少变量绑定的参数。始终使用 ,就像您在第二个代码片段中所做的那样,这似乎适用于我自己编写的一些示例数据。(…) as $var
0赞 Matias Barrios 11/16/2023
@Inian 我只想为整个数据添加一个字符串。它要么是“好的”,要么不是“好的”
1赞 Inian 11/16/2023
请参阅上面 pdf 注释中的链接片段。

答:

1赞 knittl 11/16/2023 #1

立即再次读取的变量不会给您带来任何好处。只需直接使用该值:

[{ names: .products[] | .name }]
| length  > 200
| if (.) then "ok" else "not ok" end

或者也许更具表现力:

[{ names: .products[] | .name }]
| if (length  > 200) then "ok" else "not ok" end

由于将值包装在对象中不会更改输出,因此可以将其简化为以下两种之一:

.products | if (length > 200) then "ok" else "not ok" end
if(.products | length > 200) then "ok" else "not ok" end

您可能还对 jq 的 -e 标志感兴趣,该标志根据过滤器的结果设置退出代码:

如果最后一个输出值既不是也不是,则将 jq 的退出状态设置为 0,如果最后一个输出值为 false 或 null,则为 1,如果从未生成有效结果,则为 4。通常,如果存在任何使用问题或系统错误,jq 会退出 2,如果存在 jq 程序编译错误,则退出 3,如果 jq 程序运行,则退出 0。falsenull