gpt4 book ai didi

bash - 如何在macOS/Linux bash中的jq 1.5中验证查询?

转载 作者:行者123 更新时间:2023-12-03 07:40:17 26 4
gpt4 key购买 nike

我正在尽我最大的努力找出如何告诉用户我的一个脚本,他们通过了每个 jq 1.5 无效的查询。

这是一个简单的JSON示例:

{ "foo": { "bar":"baz" } } 

我希望能够在用户提供诸如 .foo.bax之类的查询时向用户显示错误消息,但是当他们提供诸如 baz之类的正确查询时,让用户返回值 .foo.bar

我无法(或不知道如何)读取 jq的返回值,因为我需要在子shell中运行 jq,即:
value="$(echo -e "${json}" | jq -r "${query}")"

当我给它一个无效的查询时, jq总是返回一个 null字符串。但我无法将其与JSONt文件中可能包含的 null"property": "null"值区分开。

看来 jq具有可以用于此目的的各种功能,但我无法弄清楚如何使用它们。

那么,有什么方法可以让 jq验证查询,在此我可以分辨出 null"null"之间的区别?

更新

当我问这个问题时,我希望找到的是一种大致相当于 "$(jq.validate("${query}") && echo "valid")"的语法,假设 jq具有 validate()方法。

最佳答案

您可以在jq中使用一个标志来将jq的退出代码传播到shell,您可以在命令中使用它来查看它是否成功。
官方的jq-documentation为此提供了正确的选择,

-e / --exit-status:

Sets the exit status of jq to 0 if the last output values was neither false nor null, 1 if the last output value was either false or null, or 4 if no valid result was ever produced. Normally jq exits with 2 if there was any usage problem or system error, 3 if there was a jq program compile error, or 0 if the jq program ran.


您可以看到它的用法如下:
jsonStr='{"foo": 42, "bar": "less interesting data"}'
jq -er '.foo' <<<"$jsonStr"
42
echo $?
0
现在针对失败案例,
jq -er '.foo1' <<<"$jsonStr"
null
echo $?
1
请记住,如果不设置 -e标志,则不可能出现上述情况,因为请引用上述子句的最后一行

or 0 if the jq program ran


因此,除非您设置 -e标志,否则错误代码不会传播到 shell 。
(或)使用if子句的更有意义的shell构造应遵循以下步骤,
jsonStr='{"foo": 42, "bar": "less interesting data"}'

if jq -er '.foo' <<<"$jsonStr" > /dev/null; then
printf "string contained foo\n"
fi
对于失败案例,
if jq -er '.foo1' <<<"$jsonStr" > /dev/null; then
printf "string contained foo\n"
else
printf "string does not contain foo\n"
fi
如果您仔细观察的话,将转到 else部分以获取失败案例,这是您的意图。如果没有设置 -e标志,则失败案例退出代码仍将是 0,并且满足真实条件。 >/dev/null部分仅是将 stdout命令生成的 jq抑制为空流。
另请注意, -e仅从 jq-1.4开始引入。

关于bash - 如何在macOS/Linux bash中的jq 1.5中验证查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44282020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com