我正在运行此命令,但确实从json中获取了一个值;
addr=$(./xuez-cli getnetworkinfo | jq -r '.localaddresses[0].address')
它工作正常。
但是如果这个.localaddresses[0].address
部分为空或者甚至不存在,jq就会像这样将addr
变量设置为null
; addr=null
,我想检查json是否为空/空并运行其他命令,而不是将其解析为null
字符串。
我找不到解决此问题的方法。我该怎么办?
答案 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
指定-e
和false
为<视为失败),如果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