准备 DevOps 实习面试时,Shell 基础通常绕不过去。
和算法题不一样,这类题目很少追求复杂技巧,重点通常是参数处理、条件判断、循环、文本处理、日志分析,以及把日常操作写成脚本的能力。
下面整理 12 道适合自己动手练的题目。本文只保留题目、输入输出要求和必要约束,不展开参考答案。
题目 1:判断文件是否存在
写一个 Shell 脚本,接收一个文件路径作为参数。
要求:
- 文件存在时输出
file exists - 文件不存在时输出
file not found - 文件不存在时退出码必须非 0
- 如果没有传参数,需要自行补充处理逻辑
题目 2:统计目录中的 .log 文件数量
写一个 Shell 脚本,接收一个目录路径作为参数,统计该目录下 .log 文件的数量。
要求:
- 输出最终数量
- 目录不存在时给出错误提示
- 说明你统计的是当前目录,还是包含子目录的递归统计
题目 3:输出 1 到 100 中的偶数
写一个 Shell 脚本,输出 1 到 100 中所有偶数,每行一个。
要求:
- 不依赖外部文件
- 可以使用
for或while - 输出结果必须稳定
题目 4:找出访问日志里出现次数最多的 IP
给你一个 Nginx access log,找出访问次数最多的 IP,并输出该 IP 及其出现次数。
要求:
- 默认日志格式为常见 access log
- 输出格式自定,但必须同时包含 IP 和次数
- 允许使用文本处理命令组合完成
题目 5:批量检查主机连通性
准备一个 hosts.txt 文件,里面每行一个 IP 或域名。写一个脚本,逐行读取并检查每个主机是否可以 ping 通。
要求:
- 连通时输出
ok - 不连通时输出
failed - 输出中必须包含对应主机
- 空行需要自行处理
示例输出:
10.0.0.1 ok10.0.0.2 failed题目 6:检查磁盘使用率并按阈值告警
写一个脚本,检查根分区使用率。
要求:
- 使用率超过 80% 时输出
disk usage high - 否则输出
disk usage normal - 需要正确提取数值部分并进行比较
题目 7:批量重命名文件
给定一个目录,里面有一批 .txt 文件。请写一个脚本,把它们统一改名为 backup_原文件名。
要求:
- 只处理
.txt文件 - 不影响其他文件
- 如果目标文件名已存在,需要考虑如何处理
题目 8:检查进程是否存在
写一个脚本,接收一个进程名作为参数,判断该进程当前是否存在。
要求:
- 存在时输出
running - 不存在时输出
not running - 结果中最好带上进程名
题目 9:统计文本中某个单词出现的次数
写一个 Shell 脚本,接收两个参数:文件路径和目标单词,统计该单词在文件中出现的次数。
要求:
- 文件不存在时给出错误提示
- 明确你统计的是整词匹配,还是包含子串的匹配
- 输出必须包含统计结果
题目 10:每隔 5 秒记录一次系统负载
写一个脚本,每隔 5 秒获取一次系统负载,并追加写入日志文件,连续记录 12 次。
要求:
- 每条记录都要带时间戳
- 日志文件路径可自行设计
- 脚本结束后日志中应有 12 条记录
题目 11:统计错误日志行数
给定一个日志文件,统计其中包含 ERROR 的行数。
要求:
- 文件路径通过参数传入
- 文件不存在时返回错误
- 输出必须是可直接读懂的结果,而不是只打印原始匹配内容
题目 12:从 Docker 容器列表中筛出异常容器
假设机器上运行了多个 Docker 容器,请写一个脚本,筛出状态不是 Up 的容器。
要求:
- 输出容器名和状态
- 如果没有异常容器,也要给出明确结果
- 可以基于
docker ps -a的输出做处理
练习约束
如果想把这 12 题练得更扎实,可以统一给自己加几条限制:
- 先写能跑的版本,再考虑缩短命令
- 所有路径变量都加引号
- 所有脚本都补上参数校验
- 输出结果尽量保持稳定,避免只在当前样例下可用
- 每题至少独立重写两遍,不直接复制上一版
这 12 道题覆盖的范围不算难,但基本都在 DevOps 实习面试里出现过对应变体。先把这些题写顺,再继续补日志处理、awk、sed、find、系统巡检和部署脚本,会更稳一些。