如何在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"
问题原因
- Bash判断失效原因:默认
jq输出会带引号,获取空字符串时返回的是"",而非真正的空值,导致Bash中[ -z "$s" ]这类判断不生效。 - 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
相关产品推荐
相关产品推荐

