第4章 Shell脚本与编程能力面试
脚本能力是大厂Linux工程师的“隐形门槛”——自动化部署、日志分析、故障自愈、合规巡检,均依赖高质量的Shell代码。本章围绕编程思维、常见脚本考题、大厂自动化能力要求三个维度,提供结构化问答模板与实战项目案例。
面试问答卡片
📌 问题1:写一个Shell脚本,批量重命名当前目录下所有 .log 文件,将文件名中的日期从 20230101 格式改为 2023-01-01,要求保留原扩展名。
| 面试官考察点 | 正则替换能力、文件名处理、安全意识(避免破坏原始文件) |
| 回答框架 | 遍历文件 → 提取日期 → sed/awk替换 → 检查冲突 → 执行重命名 |
| 简短示例回答 | “我会先用 for f in *.log 遍历,再用 sed 提取日期部分,假设文件名是 app_20230101.log,用 mv "$f" "${f/_20230101/_2023-01-01}"。执行前先 echo 调试,避免误操作。” |
| 可能追问 | 如果有多个日期格式如何处理?如何支持递归子目录? |
| 避坑提醒 | ❌ 直接 mv * 无保护;✅ 先 ls | while read 或使用 rename 命令,并打印变更日志。 |
📌 问题2:如何判断一个Shell脚本中某个命令是否执行成功,并在失败后发送告警?
| 面试官考察点 | 退出码处理、错误传播、脚本健壮性设计 |
| 回答框架 | 检查 $? 或用 &&/|| → 失败时记录日志 + 告警 → 不影响后续任务 |
| 简短示例回答 | “我会在关键命令后使用 if [ $? -ne 0 ]; then echo "命令失败" >> error.log; curl -X POST -d "告警" 告警接口; fi。生产环境更推荐 trap 捕获异常,统一处理。” |
| 可能追问 | 如何区分告警级别?如何多个命令失败只发一次告警? |
| 避坑提醒 | ❌ 忘记重置退出码导致二次误判;✅ 每个命令独立检查,使用 set -e 需谨慎(配合 || true)。 |
📌 问题3:如何用一行命令统计 Nginx 访问日志中状态码为 502 的 IP 数量?
| 面试官考察点 | awk/grep/sort/uniq 组合使用、管道思维、性能意识 |
| 回答框架 | 过滤 502 → 提取 IP → 排序去重 → 统计计数 |
| 简短示例回答 | “grep ' 502 ' access.log | awk '{print $1}' | sort | uniq -c | sort -rn。如果日志格式不同,需调整字段位置。” |
| 可能追问 | 日志文件超过 10GB 怎么优化?如何按小时分组统计? |
| 避坑提醒 | ❌ 直接 grep 502 可能误匹配其他数字;✅ 加上空格/引号精确匹配状态码字段。 |
项目案例模板
项目名称: 多机房数据库备份自动化脚本集群
业务背景: 公司数据库分散在 5 个云机房,每天需要全量备份 + 增量备份,保留 30 天并上传至对象存储。原有手动备份经常遗漏,恢复时版本混乱。
规模指标: 日均备份任务 2000+,单次备份最大 500GB,脚本运行在 20 台备份机,总存储节约 40% 空间(通过压缩 + 全量/增量策略)。
技术栈: Bash 脚本 + mysqldump / XtraBackup + rsync + Cron + MinIO SDK(mc) + 企业微信告警 Webhook
| 核心难点 | ⚠️ 机房间网络不稳定导致 rsync 超时;不同库引擎要求不同备份方式;备份文件过期清理需保证并发安全。 |
| 面试高频追问 | 1. 如何保证备份脚本幂等(重复执行不覆盖原始数据)?2. 超时重试机制如何设计?3. 如何验证备份文件完整性并告警? |
| 可迁移回答话术 | “我通过引入本地锁文件 + 时间戳命名保证幂等;使用 timeout + 三次重试 + 指数退避处理网络超时;备份完成后计算 MD5 并对比存储端,不一致立即重新备份并告警。” |
💡 大厂自动化能力要求侧重点:
- 可维护性:注释规范、函数分模块、参数化配置(避免硬编码)
- 健壮性:出错处理、超时机制、幂等设计、日志分级
- 可扩展性:支持多实例、并行执行、与 CI/CD 集成
- 安全意识:密码不落在日志、权限最小化、临时文件清理
- 测试方法:提供测试脚本、mock 环境、dry-run 模式