You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash脚本中正确检测JSON文件中的空字符串?

Bash脚本中正确检测JSON空字符串的方法

问题重现

目标JSON内容

{
    "num_sensor" : 1,
    "J2" : {"B" : "sensor0", "A" : "sensor1", "D" : "sensor2" , "C" : "sensor3"},
    "J1" : {"B" : "", "A" : "sensor5", "D" : "sensor6" , "C" : "sensor7"} 
}

遇到的问题

  • 执行以下命令获取J1.B的值后,无法通过Bash判断其是否为空:

    s=`jq '.J1.B' ~/package/sensor_data.json`
    

    所有空判断逻辑均返回“非空”结果。

  • 执行下述jq命令时触发错误:

    jq -r '.[] | if .J1.B == ""
                       then "description is empty"
                       else .J1.B end' ~/package/sensor_data.json
    

    错误信息:

    Cannot index number with string "J1"
    

问题原因

  1. Bash判断失效原因:默认jq输出会带引号,获取空字符串时返回的是"",而非真正的空值,导致Bash中[ -z "$s" ]这类判断不生效。
  2. jq命令报错原因:.[]会遍历根节点下所有值,包括num_sensor这个数字类型字段,尝试对数字字段索引J1自然会报错。

正确解决方案

方案1:在Bash中正确处理空值

使用jq的-r(raw输出)参数获取不带引号的原始值,再进行Bash判断:

# 获取不带引号的J1.B值
s=$(jq -r '.J1.B' ~/package/sensor_data.json)

# 判断是否为空字符串
if [ -z "$s" ]; then
    echo "J1.B 是空字符串"
else
    echo "J1.B 的值为: $s"
fi

方案2:直接用jq完成判断逻辑

无需将值传入Bash变量,直接通过jq定位到目标字段完成判断:

# 基础判断写法
jq -r 'if .J1.B == "" then "description is empty" else .J1.B end' ~/package/sensor_data.json

# 更简洁的默认值写法(空字符串时返回指定内容)
jq -r '.J1.B // "description is empty"' ~/package/sensor_data.json

内容的提问来源于stack exchange,提问作者Nagarjun Vinukonda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:50:48