使用 jq 检查是否有任何值为零并将 0 返回到调用 shell 脚本

pyr*_*d13 2 shell-script json jq

我有这个 JSON 文件:

{ "key11":1010, "key12":12120, "key13":12103 }

如何jq检查与 a 对应的任何值key[0-9][0-9]是否为零,jq如果有则成功退出,否则成功退出?

我有上一个问题的脚本

#!/bin/bash
json=$(cat <<EOF
{"key11":12120,"key11_":13,"key11_yes":12107,
"key12":13492,"key12_no":9,"key12_yes":13483,
"key13":10200,"key13_no":9,"key13_yes":10191,
"key21":16756,"key21_no":30,"key21_yes":16726,
"key22":17057,"key22_no":34,"key22_yes":17023,
"key23":16798,"key23_no":25,"key23_yes":16773,
"key31":2733,"key31_yes":2733,
"key32":2561,"key32_yes":2561,
"key33":2570,"key33_yes":2570}
EOF
)
json2=$(echo ${json}|jq 'with_entries(if (.key|test("key[0-9][0-9]$")) then ( {key: .key, value: .value } ) else empty end )')
Run Code Online (Sandbox Code Playgroud)

结果是:

{ "key11": 12120, "key12": 13492, "key13": 10200, "key21": 16756, "key22": 17057, "key23": 16798, "key31": 2733, "key32": 2561, "key33": 2570 }
Run Code Online (Sandbox Code Playgroud)

现在我想检查附加到所有键$json2的值,然后如果任何条目的值为零返回0

Mic*_*mer 6

any是一个内置过滤器,如果任何项目为 true 则返回 true,否则返回false 。--exit-status/-e导致jq退出0如果最后一个输出既不是假也不是空。

如果您已经将文档筛选为您在脚本中关心的键,则可以执行以下操作:

previous_command | jq -e 'any( .[] ; . == 0 )'
Run Code Online (Sandbox Code Playgroud)

.[]拉出所有值,并且any只有在其中找到零时才会输出 true。或者,[.[]|.==0]|any或者map(.==0) | any;选择你觉得最清楚的那个。


您还可以一次性完成整个jq过程,从而节省浪费的过程:

jq -e '[to_entries | .[] | select(.key | test("key[0-9][0-9]$")) | .value == 0 ] | any' data.json
Run Code Online (Sandbox Code Playgroud)

这将选择所有匹配的键并检查每个值是否为 0,然后通过管道将结果集合通过any,如果有任何零则退出 0。如果您确定没有 NaN,您也可以将它们全部与reduce.