如果json为空,jq返回null作为字符串

时间:2018-11-03 20:02:44

标签: bash jq

我正在运行此命令,但确实从json中获取了一个值;

addr=$(./xuez-cli getnetworkinfo | jq -r '.localaddresses[0].address')

它工作正常。

但是如果这个.localaddresses[0].address部分为空或者甚至不存在,jq就会像这样将addr变量设置为nulladdr=null

,我想检查json是否为空/空并运行其他命令,而不是将其解析为null字符串。

我找不到解决此问题的方法。我该怎么办?

2 个答案:

答案 0 :(得分:1)

首先,请注意:addr=null本身并没有错;您可以测试一下:

if [[ $addr = null ]]; then ...code here...; fi

此答案的其余部分假装以上内容是不正确的。 :)


在这种情况下,有两种值得注意的做法可以提高错误处理的简便性:

  • 使用set -o pipefail将检测shell管道的任何部分(不仅仅是最后一个组件)是否失败。
  • 使用jq -e将导致jq的退出状态反映出它返回的内容为false还是null。

因此:

set -o pipefail
if addr=$(./xuez-cli getnetworkinfo | jq -er '.localaddresses[0].address'); then
  : "address retrieved successfully; this message is not logged unless set -x is active"
else
  echo "Running other logic here"
fi
如果 Running other logic here失败(并且jq指定-efalse为<视为失败),如果null报告退出状态失败,则为

答案 1 :(得分:1)

我发现对shell脚本有用的是:

jq '.foo // empty'

如果成功则返回匹配项,如果失败则返回空字符串。所以在bash中,我使用:

addr=$(./xuez-cli getnetworkinfo | jq -r '.localaddresses[0].address // empty')

if [[ ! -z "$addr" ]]; then
    # do something
fi

参考:https://github.com/stedolan/jq/issues/354#issuecomment-43147898 https://unix.stackexchange.com/questions/451479/jq-print-for-null-values