编程导航学习网站:学编程、做项目、拿 Offer!
企业高频面试题库:开始刷题,面试遇原题!
精选简历模板大全:1 分钟搞定简历!
AI 资源导航网站:获取最新 AI 黑科技!
1 对 1 模拟面试:随时随地提升面试能力
Shell 脚本求职高频面试题:开始刷题
开篇介绍
Shell 脚本是什么?
Shell 是 Linux/Unix 系统的命令行解释器,Shell 脚本就是由 Shell 命令组成的可执行文件。通过编写 Shell 脚本,我们可以将一系列命令组合起来,实现自动化任务,大大提高工作效率。
Shell 脚本广泛应用于系统管理、自动化运维、数据处理、软件部署等场景。比如自动备份数据库、批量处理文件、定时执行任务、监控系统状态、自动化部署应用等,这些工作都可以通过 Shell 脚本来完成。
为什么要学 Shell 脚本?
对于运维工程师来说,Shell 脚本是必备技能;对于后端开发工程师来说,Shell 脚本能够帮助你快速完成一些自动化任务,提高开发效率。而且 Shell 脚本的学习成本相对较低,语法简单,几天时间就能掌握基础用法。
在 AI 时代,虽然有了很多自动化工具和平台,但 Shell 脚本仍然是最灵活、最高效的自动化方案。而且现在可以使用 AI 工具(比如 ChatGPT、Gemini、DeepSeek)帮你生成 Shell 脚本,大大降低了学习门槛。
学习前提
学习 Shell 脚本需要具备基本的 Linux 命令行知识。如果你还不熟悉 Linux 命令,可以查看 Linux 服务器学习路线。
学习路线图
整体学习建议
1)边学边练:Shell 脚本的学习必须结合实践,要多写脚本、多调试。建议在 Linux 系统或 macOS(内置 Bash)上练习。
或者利用 Shell playground 在线工具 随时随地练习:
2)从简单到复杂:不要一开始就写复杂的脚本,先从简单的任务开始(如打印文本、创建文件),逐步增加复杂度。
3)善用 AI 工具:遇到不懂的命令或错误,可以让 AI 工具(如 ChatGPT)帮你解释和调试。可以到鱼皮的 AI 资源大全 中看看有没有适合你的工具。
4)学习 awk 和 sed:awk 和 sed 是 Shell 脚本中常用的文本处理工具,功能强大,建议重点学习。
5)注意 Shell 的选择:本路线以 Bash 为主,这是 Linux 系统最常用的 Shell。其他 Shell(如 Zsh、Fish)的语法略有不同。
阶段 1:Shell 基础(1-5 天)
学习目标
理解 Shell 脚本的基本概念,掌握 Shell 脚本的编写和执行方法。
知识点
Shell 基础【必学】:
什么是 Shell
常见的 Shell 类型(Bash、Zsh、Ksh、Csh)
Shebang(#!/bin/bash)
脚本的执行方式(bash script.sh、./script.sh、source script.sh)
脚本权限(chmod +x)
注释【必学】:
单行注释(#)
多行注释(:<<'COMMENT' ... COMMENT)
输出【必学】:
echo 命令
printf 命令
输入【必学】:
read 命令
命令行参数($1、$2、$@、$#)
学习重点
1)Shebang(#!/bin/bash)必须放在脚本的第一行,告诉系统使用哪个解释器来执行脚本。
2)脚本执行方式的区别:bash script.sh 会创建新的子进程执行脚本,source script.sh 在当前进程执行脚本,变量会保留。
3)建议养成良好的编码习惯,每个脚本都要添加注释,说明脚本的功能、作者、日期等。
学习资源
尚硅谷 Linux、Shell 教程
Shell 编程从入门到精通:完整教程
示例脚本
▼bash复制代码#!/bin/bash
# 第一个 Shell 脚本
# 作者:鱼皮
# 日期:2025-11-15
echo "Hello, Shell!"
echo "当前用户:$USER"
echo "当前目录:$(pwd)"
阶段 2:变量和参数(1-5 天)
学习目标
掌握 Shell 变量的定义和使用,理解特殊变量的含义。
知识点
变量定义【必学】:
变量定义(无空格:name="value")
使用变量($name 或 ${name})
只读变量(readonly)
删除变量(unset)
变量类型【必学】:
局部变量
环境变量(export)
Shell 变量
特殊变量【必学】:
$0:脚本名称
$1、$2...:位置参数
$#:参数个数
$@:所有参数(列表形式)
$*:所有参数(字符串形式)
$?:上一条命令的退出状态
$$:当前进程 ID
字符串操作【建议学】:
字符串拼接
获取字符串长度(${#string})
提取子字符串(${string:start:length})
字符串替换(${string/old/new})
数组【建议学】:
定义数组(arr=(1 2 3))
访问数组元素(${arr[0]})
获取数组长度(${#arr[@]})
遍历数组
学习重点
1)变量定义时等号两边不能有空格,这是 Shell 的语法规则。name="value" 是正确的,name = "value" 会报错。
2)使用变量时建议加花括号 ${name},这样可以避免歧义,特别是在字符串拼接时。
3)特殊变量非常重要,$? 可以用来判断命令是否执行成功(0 表示成功,非 0 表示失败)。
示例脚本
▼bash复制代码#!/bin/bash
# 变量和参数示例
# 定义变量
name="编程导航"
age=5
# 使用变量
echo "网站名称:${name}"
echo "运营年限:${age}年"
# 命令行参数
echo "脚本名称:$0"
echo "第一个参数:$1"
echo "参数个数:$#"
echo "所有参数:$@"
# 字符串操作
url="https://www.codefather.cn"
echo "URL 长度:${#url}"
echo "域名:${url:8}"
# 数组
sites=("编程导航" "面试鸭" "SQL自学网")
echo "第一个网站:${sites[0]}"
echo "网站数量:${#sites[@]}"
阶段 3:流程控制(2-7 天)
学习目标
掌握 Shell 脚本的流程控制语句,能够编写包含条件判断和循环的脚本。
知识点
条件判断【必学】:
test 命令
[ ] 表达式
[[ ]] 表达式(推荐)
文件判断(-e、-f、-d、-r、-w、-x)
数值比较(-eq、-ne、-gt、-lt、-ge、-le)
字符串比较(=、!=、-z、-n)
逻辑运算(-a、-o、!)
if 语句【必学】:
if...then...fi
if...then...else...fi
if...then...elif...else...fi
case 语句【必学】:
case...in...esac
循环语句【必学】:
for 循环(for i in list; do...done)
while 循环(while condition; do...done)
until 循环(until condition; do...done)
break 和 continue
学习重点
1)推荐使用 [[ ]] 而不是 [ ],[[ ]] 功能更强大,支持正则匹配,而且不需要对变量加引号。
2)文件判断非常常用,如 -f file 判断文件是否存在且为普通文件,-d dir 判断目录是否存在。
3)for 循环可以遍历命令输出、数组、文件列表等,非常灵活。
示例脚本
▼bash复制代码#!/bin/bash
# 流程控制示例
# if 语句
age=20
if [[ $age -ge 18 ]]; then
echo "已成年"
else
echo "未成年"
fi
# case 语句
read -p "请输入你的选择(1-3):" choice
case $choice in
1)
echo "你选择了选项1"
;;
2)
echo "你选择了选项2"
;;
3)
echo "你选择了选项3"
;;
*)
echo "无效选择"
;;
esac
# for 循环
echo "打印1到5:"
for i in {1..5}; do
echo $i
done
# while 循环
echo "倒计时:"
count=5
while [[ $count -gt 0 ]]; do
echo $count
((count--))
sleep 1
done
echo "时间到!"
# 遍历文件
echo "当前目录的文件:"
for file in *; do
if [[ -f $file ]]; then
echo "文件:$file"
fi
done
阶段 4:函数和文件操作(2-7 天)
学习目标
掌握 Shell 函数的定义和使用,学习常用的文件操作和文本处理工具。
知识点
函数【必学】:
函数定义(function name() { })
函数调用
函数参数($1、$2...)
函数返回值(return)
文件操作【必学】:
读取文件(cat、head、tail、less、more)
写入文件(> 覆盖、>> 追加)
重定向(标准输入、标准输出、标准错误)
文本处理三剑客【必学,重点】:
grep:搜索文本
基本用法(grep pattern file)
正则表达式匹配
常用选项(-i 忽略大小写、-v 反向匹配、-n 显示行号、-r 递归搜索)
sed:文本替换和编辑
替换(sed 's/old/new/' file)
删除行(sed '/pattern/d' file)
插入行(sed 'i\text' file)
awk:文本分析和处理
基本用法(awk '{print $1}' file)
内置变量($0 整行、$1第一列、NR行号、NF列数)
条件和循环
其他常用命令【建议学】:
find:查找文件
xargs:构建命令行
cut:提取列
sort:排序
uniq:去重
wc:统计行数/单词数/字符数
学习建议
1)grep、sed、awk 被称为 “文本处理三剑客”,是 Shell 脚本中最重要的工具,一定要重点学习。
2)awk 功能非常强大,可以当作一门编程语言来学习。awk 特别适合处理结构化文本(如日志文件、CSV 文件)。
3)sed 主要用于文本替换和编辑,比如批量替换文件内容、删除特定行等。
4)这些工具一般通过管道(|)组合使用,实现复杂的文本处理任务。
学习资源
Shell 自动化运维实战:完整教程
运维三剑客实战:grep、awk、sed
示例脚本
▼bash复制代码#!/bin/bash
# 函数和文本处理示例
# 函数定义
function greet() {
echo "Hello, $1!"
}
# 调用函数
greet "鱼皮"
# 读取文件并统计行数
if [[ -f "/etc/passwd" ]]; then
line_count=$(wc -l < /etc/passwd)
echo "/etc/passwd 有 $line_count 行"
fi
# grep 示例:搜索包含 "root" 的行
echo "搜索 /etc/passwd 中的 root:"
grep "root" /etc/passwd
# awk 示例:提取第一列
echo "提取 /etc/passwd 的第一列:"
awk -F: '{print $1}' /etc/passwd | head -5
# sed 示例:替换文本
echo "hello world" | sed 's/world/Shell/'
# 管道组合:统计当前目录的文件数
echo "当前目录的文件数:"
ls -l | grep "^-" | wc -l
阶段 5:实战应用(3-10 天)
学习目标
通过实际案例掌握 Shell 脚本的实战技巧,能够编写实用的自动化脚本,比如系统监控、日志分析、自动化部署等场景。
实战案例
现在有 AI 了,其实只要能看懂下面的脚本问题就不大~
案例 1:系统监控脚本
▼bash复制代码#!/bin/bash
# 系统监控脚本
echo "========== 系统信息 =========="
echo "主机名:$(hostname)"
echo "内核版本:$(uname -r)"
echo "运行时间:$(uptime -p)"
echo "========== CPU 使用率 =========="
top -bn1 | grep "Cpu(s)" | awk '{print "CPU使用率:" 100-$8 "%"}'
echo "========== 内存使用情况 =========="
free -h | grep "Mem" | awk '{print "总内存:" $2 "\n已用内存:" $3 "\n可用内存:" $4}'
echo "========== 磁盘使用情况 =========="
df -h | grep "^/dev"
案例 2:自动备份脚本
▼bash复制代码#!/bin/bash
# 数据库备份脚本
# 配置
DB_NAME="mydb"
DB_USER="root"
DB_PASS="password"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${DATE}.sql"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份数据库
echo "开始备份数据库 $DB_NAME..."
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_FILE
# 检查备份是否成功
if [[ $? -eq 0 ]]; then
echo "备份成功:$BACKUP_FILE"
# 压缩备份文件
gzip $BACKUP_FILE
echo "压缩完成:${BACKUP_FILE}.gz"
# 删除7天前的备份
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
echo "清理完成"
else
echo "备份失败!"
exit 1
fi
案例 3:批量处理文件
▼bash复制代码#!/bin/bash
# 批量重命名图片文件
# 检查参数
if [[ $# -lt 1 ]]; then
echo "用法:$0 <目录>"
exit 1
fi
DIR=$1
if [[ ! -d $DIR ]]; then
echo "错误:目录不存在"
exit 1
fi
# 批量重命名
count=1
for file in $DIR/*.jpg; do
if [[ -f $file ]]; then
new_name="$DIR/image_$(printf "%03d" $count).jpg"
mv "$file" "$new_name"
echo "重命名:$file -> $new_name"
((count++))
fi
done
echo "处理完成,共重命名 $((count-1)) 个文件"
案例 4:日志分析脚本
▼bash复制代码#!/bin/bash
# 分析 Nginx 访问日志
LOG_FILE="/var/log/nginx/access.log"
if [[ ! -f $LOG_FILE ]]; then
echo "错误:日志文件不存在"
exit 1
fi
echo "========== Nginx 日志分析 =========="
# 统计总访问量
total=$(wc -l < $LOG_FILE)
echo "总访问量:$total"
# 统计访问最多的 IP
echo "访问最多的 IP Top 10:"
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -rn | head -10
# 统计访问最多的 URL
echo "访问最多的 URL Top 10:"
awk '{print $7}' $LOG_FILE | sort | uniq -c | sort -rn | head -10
# 统计状态码分布
echo "HTTP 状态码分布:"
awk '{print $9}' $LOG_FILE | sort | uniq -c | sort -rn
学习建议
1)实战案例要结合实际需求,不要为了写脚本而写脚本。思考工作中有哪些重复性的任务可以用脚本自动化。
2)脚本要考虑错误处理,如检查文件是否存在、命令是否执行成功、参数是否正确等。
3)复杂的脚本要添加注释,方便自己和他人理解。
4)定时执行脚本可以使用 cron 定时任务,如每天凌晨 2 点执行备份脚本。
求职备战
学习建议
Shell 脚本一般不是单独的面试科目,而是作为 Linux 运维或后端开发岗位的一部分来考察。面试时可能会要求现场编写简单的 Shell 脚本,或者询问 Shell 脚本的相关知识。
1)准备常用脚本:准备几个常用的 Shell 脚本案例(如系统监控、自动备份、日志分析),能够快速说出脚本的功能和实现思路。
2)掌握文本处理三剑客:grep、sed、awk 是面试的高频考点,要能够熟练使用。
3)理解脚本的执行流程:要理解 Shell 脚本的执行过程,如 Shebang 的作用、变量的作用域、管道的工作原理等。
经典面试题
Shell 脚本的第一行 #!/bin/bash 有什么作用?
source、sh、bash、./ 执行脚本有什么区别?
$# 和 $@ 有什么区别?
如何判断一个文件是否存在?
如何在 Shell 脚本中捕获命令的输出?
grep、sed、awk 各有什么特点?如何选择?
如何在 Shell 脚本中实现异常处理?
面试题库
Shell 面试题 - 面试鸭
Linux 系统面试题 - 面试鸭
求职资源
鱼皮的保姆级求职指南:从简历到面试的完整指南
编程导航的求职干货分享:求职经验和技巧
持续学习资源
学习网站
⭐ 编程导航:学习路线、项目教程、面试题
Linux 学习路线:完整的 Linux 学习路线
技术博客
Linux Journal:Linux 和 Shell 技术
Red Hat Blog:Red Hat 系统管理
Ubuntu Blog:Ubuntu 官方博客
Shell 脚本库
awesome-shell:Shell 资源大全
pure-bash-bible:Bash 技巧集合
总结
Shell 脚本是 Linux/Unix 系统管理和自动化运维的重要工具,虽然语法相对简单,但功能非常强大。通过编写 Shell 脚本,我们可以将重复性的工作自动化,大大提高工作效率。
学习 Shell 脚本不需要深入学习所有特性,掌握基础语法、流程控制、文本处理三剑客(grep、sed、awk)就足够应对大部分场景。重要的是要多写脚本、多实践,结合实际工作需求来学习。
在 AI 时代,虽然有了很多自动化工具,但 Shell 脚本仍然是最灵活、最高效的自动化方案。而且现在可以使用 AI 工具帮你生成和调试 Shell 脚本,学习起来更加轻松。
希望这份学习路线能够帮助大家快速掌握 Shell 脚本,提升工作效率。
加油小伙伴们 💪🏻!
程序员必备资源
1)程序员学习交流圈:极客教程、实战项目、求职宝典
2)程序员面试八股文:实习/校招/社招高频考点、企业真题解析
3)程序员写简历神器:专业模板、丰富例句、直通面试
4)AI 知识资源大全:前沿技术、最新 AI 资讯、提示词大全
5)1 对 1 模拟面试:实习/校招/社招面试拿 Offer 必备