如何使用Bash或Jq检查JSON是否为空对象?——解决重复值检测函数返回结果的判断问题
解决JQ输出空对象的Bash判断问题
你的问题根源在于,Bash的-s选项是检查文件是否为空(字节数为0),但空对象{}本身是有字符内容的(至少包含{和}两个字符),所以! -s "$dups"永远不会成立,导致你的逻辑完全反了。
要正确判断jq函数返回的是否是空对象,应该直接用jq本身来解析内容,而不是依赖文件大小检查。这里有两种实用的方案:
方案1:不生成中间文件(更高效)
直接捕获jq的输出,用jq判断是否为空对象,根据退出码分支处理:
# 捕获check_dups函数的输出 dups_result=$(<"$baskets" jq -L "$HOME" 'check_dups') # 用jq -e判断是否为空对象:length == 0表示空对象,-e会把布尔结果转为退出码 if echo "$dups_result" | jq -e 'length == 0' >/dev/null; then echo -e "${GREEN}[SUCCESS]${NC} No duplicates found" >&2 else echo -e "${RED}[Error]${NC} Duplicates found! Please review duplicates below" >&2 # 格式化输出重复内容 echo "$dups_result" | jq '.' fi
方案2:保留中间文件的场景
如果必须保留$dups文件,直接让jq读取该文件进行判断:
<"$baskets" jq -L "$HOME" 'check_dups' > "$dups" # jq直接读取文件,判断是否为空对象 if jq -e 'length == 0' "$dups" >/dev/null; then echo -e "${GREEN}[SUCCESS]${NC} No duplicates found" >&2 else echo -e "${RED}[Error]${NC} Duplicates found! Please review duplicates below" >&2 jq '.' "$dups" fi
关键解释
jq -e:这个选项会把jq表达式的结果转为退出码——如果表达式结果为true/非空值,退出码为0;如果是false/空值,退出码为1,刚好适配Bash的if判断逻辑。length == 0:对于JSON对象来说,length返回的是对象中键值对的数量,空对象的长度就是0,这个判断比直接对比字符串{}更可靠(避免因jq输出缩进/空格差异导致误判)。
内容的提问来源于stack exchange,提问作者Jengels
相关产品推荐
相关产品推荐

