You need to enable JavaScript to run this app. Bash中基于jq判断JSON列表是否为空的if语句编写问题
优惠活动
大模型
产品
解决方案
定价
更多

Bash中基于jq判断JSON列表是否为空的if语句编写问题

原代码存在的核心错误
  • 管道逻辑失效:$myjson是存储了JSON字符串的shell变量,直接接在管道左侧没有通过echo/printf将内容传递给jq,jq无法拿到有效输入
  • jq查询语法错误:.applist, length的逻辑是同时返回.applist对象和整个JSON根节点的总长度,并非取.applist字段自身的长度,正确取长写法应为.applist | length
  • if判断逻辑不匹配:Bash的if是根据命令的退出状态码做判断,不是直接把管道输出的数值当判断条件;原写法里的算术判断结构也没有正确承接管道输出
  • 文件写入无保护:如果把重定向写在if语句层级,shell会在判断执行前就截断清空myFile.json,哪怕后续校验失败也会把原有文件内容抹掉
  • 缺少前置校验:既没有捕获curl本身的执行错误(比如网络不通、API返回非JSON的错误页),也没有先校验返回内容是不是合法JSON,很容易因为脏数据触发异常分支
修正后的正确实现逻辑
# 捕获curl响应内容与执行状态,避免静默失败
resp=$(curl -sS -X GET "https://api.steampowered.com/ISteamApps/GetAppList/v2/")
curl_exit_code=$?

# 第一层校验:curl执行本身失败时直接走异常分支
if [ "$curl_exit_code" -ne 0 ]; then
    printf "don't do anything"
    exit 1
fi

# 第二层校验:JSON合法性 + applist长度校验
# jq的-e参数会在最终判断结果为false/空值时返回非0退出码,完美适配Bash if的判断规则
if echo "$resp" | jq -e '.applist | length > 0' >/dev/null; then
    # 仅校验通过时才执行文件写入,从根源上避免异常时截断原有文件
    echo "$resp" | jq -r '.' > myFile.json
else
    printf "don't do anything"
fi
关键注意事项
  • 引用存储JSON的shell变量时必须加双引号,避免JSON内容里的空格、特殊字符被shell拆词,导致jq解析失败
  • 不要把文件重定向写在if语句的外层,必须把写入动作完整放在校验通过的分支内
  • 使用jq -e代替手动对比长度值的写法,既可以自动识别非合法JSON的脏数据,也能简化判断逻辑

内容的提问来源于stack exchange,提问作者Halmy Khozaldy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 10:45:06