jq处理空输入不返回非零码,如何检测slot键不存在并报错?
如何让jq在slot键不存在或输入无效JSON时触发错误?
问题描述
以下代码在输入包含slot键的有效JSON时,执行结果符合预期:
echo '{"slot":"we"}' | jq -re '.slot' || exit 1
但输入空白字符或空字符串时,jq的退出码仍为0,未触发预期的错误退出:
# 输入空白字符 echo ' ' | jq -re '.slot' || exit 1 # 输入空字符串 echo '' | jq -re '.slot' || exit 1
原因分析
- 输入空白字符(如空格)时,jq会将其解析为
null,访问null.slot得到null;部分旧版jq的-e选项仅在输出为false时返回非零退出码,null不会触发非零退出。 - 输入空字符串时,若环境未正确捕获jq的解析错误退出码,会导致后续的
|| exit 1逻辑不生效。
解决方案
方案1:检查键存在性并主动抛出错误
使用has("slot")明确校验目标键是否存在,不存在时触发错误:
echo '{"slot":"we"}' | jq -re 'if has("slot") then .slot else error("slot键不存在") end' || exit 1
方案2:用默认操作符简化错误触发逻辑
利用jq的//默认操作符,当.slot返回null或false时直接抛出错误:
echo '{"slot":"we"}' | jq -re '.slot // error("slot键不存在或值为null")' || exit 1
效果验证
- 输入包含
slot的有效JSON:正常输出值,退出码0,不会触发exit 1。 - 输入无
slot的有效JSON:jq抛出错误,退出码非零,触发exit 1。 - 输入空白字符:解析为
null后触发错误,退出码非零,触发exit 1。 - 输入空字符串:jq解析失败,退出码非零,触发
exit 1。
内容的提问来源于stack exchange,提问作者Alberto B
相关产品推荐
相关产品推荐

