Skip to main content
实战日:今天是第一周的”期末考试”。你需要融合前 5 天学到的 Shell 逻辑、SQL 查询、管道与重定向,编写一个完整的 自动化报表生成工具。今天不只是写代码,而是要彻底理解 “如何将 Shell 和 SQL 结合起来”“如何生成格式化的报表” 以及 “如何编写健壮的生产级脚本”

实战目标 | Project Goal

我们将开发一个名为 06_sql_shell_integrate.sh 的工具,用于自动化统计业务数据。

核心功能

  1. 自动连接 MySQL 数据库
  2. 执行复杂的联表统计查询
  3. 格式化输出 Markdown 报表
  4. 添加时间戳并归档
  5. 错误处理和日志记录

涉及技能

  • Shell: 变量、函数、Here Document、错误处理
  • SQL: GROUP BY, JOIN, COUNT, SUM
  • Linux: 输出重定向、日期处理、文件操作
  • Markdown: 表格格式化

代码任务 (90 mins)

1

环境准备与数据模拟

首先确保数据库中有足够的测试数据。执行以下 SQL 准备环境:任务分解
  1. 确保 orders 表存在
  2. 插入模拟订单数据
  3. 验证数据完整性
验证步骤
  1. 连接 MySQL:
  2. 执行初始化 SQL:
    或者直接复制粘贴执行
  3. 验证数据:
2

编写自动化脚本

这是今天的重头戏。我们将使用 mysql -e 命令在 Shell 中执行 SQL,并利用 Here Document (EOF) 处理多行 SQL。任务分解
  1. 定义配置变量
  2. 编写数据库连接检查函数
  3. 编写 SQL 查询函数
  4. 编写报表生成函数
  5. 添加错误处理
常见错误
  • mysql -u$DB_USER -p$DB_PASS - 密码参数格式错误,应该是 -p$DB_PASS(无空格)
  • docker exec mysql-learn mysql ... - 容器名称错误或容器未运行
  • sed 's/\t/ /g' - 制表符替换不正确,Markdown 表格需要 ” | ”
  • mysql -u$DB_USER -p$DB_PASS - 正确(注意 -p 和密码之间无空格)
  • docker exec "$DB_HOST" mysql ... - 正确(使用变量)
  • sed 's/\t/ | /g' - 正确(替换为表格格式)
验证步骤
  1. 确保 MySQL 容器运行:
  2. 运行脚本:
  3. 检查输出:
    • 应该看到数据库连接检查结果
    • 应该看到报表生成成功信息
    • 应该看到报表预览
  4. 查看生成的报表:
  5. 验证报表内容:
    • 应该包含用户统计表格
    • 应该包含汇总信息
    • 表格格式应该正确
3

添加异常处理 (Bonus)

目前的脚本比较”脆弱”,如果数据库连接失败会怎样?让我们增强错误处理。改进点
  1. 数据库连接检查
  2. SQL 执行错误处理
  3. 文件操作错误处理
  4. 更详细的日志记录
错误处理最佳实践
  • 检查命令执行结果if [ $? -eq 0 ]; then ... fi
  • 检查文件是否存在if [ -f "$file" ]; then ... fi
  • 检查目录是否可写if [ -w "$dir" ]; then ... fi
  • 检查变量是否为空if [ -z "$var" ]; then ... fi
  • 记录所有操作:成功和失败都要记录
  • 包含时间戳:便于追踪问题
  • 包含详细信息:错误消息要具体
  • 使用不同级别:INFO、WARNING、ERROR
  • 使用 exit 码:0 表示成功,非零表示失败
  • 清理资源:退出前清理临时文件
  • 提供错误信息:告诉用户发生了什么

今日产出物

  • day06/06_sql_shell_integrate.sh - Shell + SQL 报表生成脚本
  • day06/init_data.sql - 测试数据初始化脚本
  • day06/reports/weekly_report_*.md - 生成的报表文件

参考代码

查看参考代码

在 GitHub 查看完整的示例代码

在线运行

使用在线编辑器测试代码

实际应用场景

Shell + SQL 整合在生产环境的应用

  • 自动化报表:定时生成业务报表,发送给管理层
  • 数据导出:将数据库数据导出为 CSV、JSON 等格式
  • 数据同步:在不同数据库之间同步数据
  • 监控告警:监控数据库指标,异常时发送告警
  • 数据备份:结合 Shell 脚本和 SQL 实现数据备份

报表生成的最佳实践

  • 模板化:使用模板生成报表,便于维护
  • 格式化:生成 Markdown、HTML、PDF 等格式
  • 自动化:使用 cron 定时生成报表
  • 归档:保存历史报表,便于对比分析
  • 通知:报表生成后自动发送邮件或消息
第一周总结
  • 你已经掌握了 Shell 脚本的基础到进阶:变量、流程控制、函数、管道、三剑客
  • 你已经掌握了 SQL 的基础到优化:CRUD、联表、聚合、索引、慢查询优化
  • 你已经能够编写生产级的自动化脚本,整合 Shell 和 SQL
  • 明天是复盘日,回顾和巩固这一周的学习成果

上一天: 优化实战

Day 05 | Shell 脚本实战与 SQL 优化

下一天: 第一阶段复盘

Day 07 | 第一阶段复盘