对于jq
的给定选择器,我想知道选择器是否成功或者输入是否成功。例如,以下内容正确指示错误状态:
% jq -re .bad <<<'{}'
null
% echo $?
1
%
但是,以下错误指示错误状态(根据我的需要):
% jq -re .key <<<'{"key":false}'
false
% echo $?
1
%
上述问题是,如果最后一个输出值为false
或null
,则-e选项的返回状态为1。但是,如果JSON输入中存在false和null值,则此返回状态会给出错误的印象,即发生了某些故障。
在返回代码1的情况下,我是否强制要检查密钥是否存在?例如:
#!/bin/bash
Result=$(jq -re .key <<<'{"key":false}')
Status=$?
if [[ $Status -eq 1 ]] ; then
jq -re '. | has("key")' <<<'{"key":false}' && (exit 0) || (exit 1)
else
(exit $Status)
fi
# At this point $? can be relied on to indicate success/failure
上述解决方案会将返回状态1更改为0,并且对于简单的jq选择器是可接受的,但对于可能生成false或null的有效结果的计算选择器,此解决方案并不令人满意。
那么,是否有任何方法可以知道jq选择器是否真的成功或失败(即使对于计算选择器),考虑到false
和null
等结果可能有效或无效,具体取决于选择器和输入
解决方案应在Bash 4.2或更高版本中完成。
答案 0 :(得分:0)
请记住,它仅取决于过滤器的最后结果。因此,最后将检查作为过滤器的一部分添加可能会更容易。你只需要记住忽略最后的结果。
$ jq -re --arg key 'key' '.[$key], has($key)' <<< '{"key":false}'
false
true
$ echo $?
0
答案 1 :(得分:0)
我并不完全清楚你想要的是什么 做,但我的印象是你正在以错误的方式去做。 部分问题可能是术语问题的结果。 为了避免它们,我将采用适合JSON和jq。
的术语首先我要指出,在jq中,诸如{} | .a
之类的表达式并不被视为错误。如果您希望在尝试访问不存在的键的值时引发错误条件,
你可以这样写:
if has("a") then .a else error("no such key") end
区分输入对象具有键的情况和不具有键的情况的另一种方式 写的是:
如果有(“a”)则.a else为空结束
或更紧凑:
选择(has(“a”))| .A
您可以将此技术与jq的-c选项结合使用,如以下bash分配所示:
result=$(jq -c 'select(has("a")) | .a' INPUT.json)
n=$(wc -l <<< "$result")
然后,您可以检查$ n。
的值答案 2 :(得分:0)
我认为这个过滤器可行:
map(select(.user==$Name and .value==true))[0] or error($Name)
示例:
#!/bin/bash
for i in steve tom mary; do
echo '[{"user":"steve", "value":false},{"user":"tom", "value":true}]' \
| jq -M -r --arg Name $i 'map(select(.user==$Name and .value==true))[0] or error($Name)'
echo $i $?
done
输出:
jq: error (at <stdin>:1): steve
steve 5
true
tom 0
jq: error (at <stdin>:1): mary
mary 5
因此,在steve
和mary
jq的情况下,jq返回非零退出状态,在tom
的情况下,它返回零退出状态。