【问题标题】:jq returning null as string if the json is empty如果 json 为空,jq 返回 null 作为字符串
【发布时间】:2018-11-03 20:02:43
【问题描述】:

我正在运行这个命令确实从 json 中获取一个值;

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

而且效果很好。

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

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

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

【问题讨论】:

  • ./xuez-cli getnetworkinfo 的输出添加到您的问题中。

标签: bash jq


【解决方案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

【讨论】:

  • 我认为这应该是正确的答案,因为它更好地反映了空字符串的问题,所以请@Tolgahan Bozkurt 批准这个答案为正确答案!
  • Nice ;-) 将其与 '$(...)' 一起使用可能不准确,但当原始值末尾有换行符时,它们将被截断。
【解决方案2】:

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

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

此答案的其余部分假设上述内容不真实。 :)


有两种值得注意的做法可以提高这种情况下错误处理的容易程度:

  • 使用set -o pipefail 将检测外壳管道的任何部分(不仅仅是最后一个组件)是否出现故障。
  • 使用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

...如果 其中一个 jq 失败,则转到Running other logic here(并且-e 指定falsenull 应被视为失败),或 如果xuez-cli 报告退出状态不成功。

【讨论】:

    猜你喜欢
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多