一、学习目标
- Shell 脚本进阶:给脚本加 “判断逻辑”(比如 “如果文件存在就做 A,不存在就做 B”)和 “循环操作”(比如 “批量创建 10 个文件”),让脚本更智能。
- 系统监控工具:除了之前的
top
,再学 3 个看系统状态的命令,帮你快速找到 “电脑卡、磁盘慢、网络卡” 的原因。
二、学习内容
(一)Shell 脚本进阶:让脚本 “会思考、会重复”
你已经会写简单脚本了(比如输出一句话),今天给脚本加 “脑子”—— 就像给机器人加 “判断能力” 和 “重复能力”。
1. 条件判断(if 语句):“如果... 就... 否则...”
生活比喻:就像你每天出门前的思考 ——“如果下雨(条件),就带伞(操作);否则(不下雨),就不带伞(操作)”。
脚本里的格式(固定套路,记下来):
bash
if [ 条件 ]; then
# 条件成立时执行的命令
else
# 条件不成立时执行的命令
fi # 必须以fi结尾(if倒过来)
(1)判断 “文件是否存在”(最常用)
场景:比如你想备份一个文件,但先得确认这个文件有没有,没有就提示 “文件不存在”。
步骤 1:创建脚本file_check.sh
终端输入:
bash
nano ~/linux_study/file_check.sh # 打开编辑器
步骤 2:写入以下内容(复制粘贴,注意符号前后有空格!)
bash
#!/bin/bash
# 脚本功能:判断文件是否存在
# 定义要检查的文件(比如之前的day1_note.txt)
file="~/linux_study/day1_note.txt"
# 条件判断:如果文件存在
if [ -f "$file" ]; then # -f 表示“判断是否为普通文件”
echo "文件存在!我来显示它的内容:"
cat "$file" # 显示文件内容
else
echo "文件不存在哦,请检查文件名是否正确~"
fi
步骤 3:保存并加执行权限
- 按
Ctrl+O
→回车保存,Ctrl+X
退出编辑器。 - 加权限:
chmod +x ~/linux_study/file_check.sh
步骤 4:运行脚本看效果
bash
~/linux_study/file_check.sh
- 如果你有
day1_note.txt
:会显示 “文件存在!...” 并打印文件内容。 - 如果你删了这个文件(故意测试):会显示 “文件不存在哦...”。
(2)判断 “数字大小”(比如 “如果内存使用率超过 80% 就报警”)
场景:监控系统状态时常用,比如 “如果磁盘快满了(使用率> 90%),就提示清理”。
示例脚本check_disk.sh
:
bash
#!/bin/bash
# 功能:检查根目录磁盘使用率是否超过80%
# 获取根目录使用率(只取数字部分,比如“75”)
# 命令解释:df -h / 取根目录信息,grep / 过滤行,awk '{print $5}' 取第5列(比如“75%”),sed 's/%//' 去掉百分号
usage=$(df -h / | grep / | awk '{print $5}' | sed 's/%//')
# 判断如果使用率>80,就报警
if [ $usage -gt 80 ]; then # -gt 表示“大于”(greater than)
echo "警告!磁盘快满了,使用率已达${usage}%,快清理!"
else
echo "磁盘状态良好,使用率${usage}%"
fi
操作步骤:
- 创建脚本:
nano ~/linux_study/check_disk.sh
,粘贴上面内容。 - 加权限:
chmod +x check_disk.sh
。 - 运行:
./check_disk.sh
,会显示你当前的磁盘使用率状态(虚拟机里一般不会超 80%,主要学判断逻辑)。
2. 循环操作(for 循环):让脚本 “重复做事不偷懒”
生活比喻:就像 “每天早上重复做 3 件事:刷牙→洗脸→吃早饭”,脚本里用for
循环让命令重复执行。
(1)批量创建文件(比如 “创建 10 个日志文件”)
场景:测试时需要多个文件,手动创建太麻烦,用循环一键搞定。
脚本create_files.sh
:
bash
#!/bin/bash
# 功能:批量创建10个日志文件(log1.txt到log10.txt)
# 循环1到10的数字({1..10}表示1到10的范围)
for i in {1..10}; do
# 每次循环创建一个文件,文件名里包含当前数字$i
touch "log${i}.txt"
echo "创建了log${i}.txt" # 显示进度
done
操作步骤:
- 创建脚本:
nano ~/linux_study/create_files.sh
,粘贴内容。 - 加权限:
chmod +x create_files.sh
。 - 运行:
./create_files.sh
,会看到终端依次显示 “创建了 log1.txt” 到 “log10.txt”,用ls
查看,10 个文件真的出现了!
(2)循环处理已有文件(比如 “给所有.txt 文件加一行内容”)
场景:批量修改文件,比如 “给昨天创建的所有笔记文件加一句‘完成于 2025 年 7 月’”。
脚本add_line_to_txt.sh
:
bash
#!/bin/bash
# 功能:给当前目录下所有.txt文件末尾加一行文字
# 循环当前目录下的所有.txt文件(*.txt表示“所有以.txt结尾的文件”)
for file in *.txt; do
# 给每个文件追加一行内容(>>是“追加”,不会覆盖原内容)
echo "完成于2025年7月" >> "$file"
echo "已给$file添加内容"
done
操作步骤:
- 确保
linux_study
目录下有几个.txt 文件(比如之前的day1_note.txt
等)。 - 创建脚本并运行,用
cat day1_note.txt
查看,末尾真的多了一行文字!
(二)系统监控工具:3 个命令快速找 “卡慢原因”
之前学了top
看进程,今天学 3 个更细分的工具,分别看 “系统整体状态”“磁盘速度”“网络连接”。
1. vmstat:看系统 “整体健康度”(CPU / 内存 / IO 是否繁忙)
作用:像 “医院的全身检查报告”,一眼看出 CPU 是否满了、内存是否够用、磁盘读写是否频繁。
操作步骤:
- 终端输入命令(
1
表示每秒刷新一次):bash
vmstat 1
- 输出解读(只看前 5 列,其他忽略):
bash
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 1500000 50000 800000 0 0 0 0 100 200 5 3 92 0 0
r
(运行队列):数字 > CPU 核心数(比如 4 核电脑,r>4),表示 CPU 忙不过来(电脑卡)。free
(空闲内存):数字越小,内存越紧张(如果接近 0,可能卡)。us
(用户进程占 CPU):数字高(比如 > 80),说明你运行的程序太费 CPU(比如大游戏)。wa
(等待 IO 占 CPU):数字高(比如 > 20),说明磁盘读写太慢(比如复制大文件时)。
- 按
Ctrl+C
退出监控。
2. iostat:看 “磁盘读写速度”(找 “复制文件慢” 的原因)
作用:专门监控磁盘的 “读写速度” 和 “繁忙程度”,比如复制文件特别慢时,用它看是不是磁盘卡了。
操作步骤:
- 先安装(Ubuntu 默认没有):
bash
sudo apt install sysstat # 输入密码后按y
- 运行命令(
1
表示每秒刷新一次):bash
iostat 1
- 输出解读(重点看磁盘部分):
bash
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 5.00 0.00 20.00 0 20
tps
(每秒 IO 次数):数字越高,磁盘越忙(比如 > 100 可能卡)。kB_read/s
(每秒读速度):比如复制文件时,这里会显示具体速度(如果远低于磁盘标称速度,可能磁盘有问题)。
3. netstat:看 “网络连接”(找 “谁在偷偷联网”)
作用:列出电脑所有网络连接(比如 “哪个程序连了哪个 IP”“用了哪个端口”),排查异常联网。
操作步骤:
- 先安装(Ubuntu 默认没有):
bash
sudo apt install net-tools # 输入密码后按y
- 查看所有网络连接(加
-tuln
只看 “正在监听的端口”,更清晰):bash
netstat -tuln
- 输出解读(重点看 3 列):
bash
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp6 0 0 :::80 :::* LISTEN
Local Address:端口
:比如0.0.0.0:22
表示 “本机的 22 端口(SSH)向所有人开放”。State
(状态):LISTEN
表示 “正在监听(等待连接)”,比如 SSH 服务启动后会显示这个。
三、超详细实践操作(一步不落跟着做)
(一)Shell 脚本进阶实践
实践 1:写一个 “判断文件是否存在,存在就删除” 的脚本
- 进入
linux_study
目录:bash
cd ~/linux_study
- 创建脚本
delete_if_exists.sh
:bash
nano delete_if_exists.sh
- 粘贴以下内容(逐行解释写在注释里):
bash
#!/bin/bash # 功能:判断test_delete.txt是否存在,存在就删除,不存在就提示 # 定义要检查的文件 file="test_delete.txt" # 先创建一个测试文件(方便测试) touch $file echo "已创建测试文件$file" # 判断文件是否存在 if [ -f "$file" ]; then rm $file # 删除文件 echo "文件$file已删除!" else echo "文件$file不存在,不用删~" fi
- 保存退出(
Ctrl+O
→回车→Ctrl+X
)。 - 加执行权限:
bash
chmod +x delete_if_exists.sh
- 运行脚本:
bash
./delete_if_exists.sh
- 预期结果:先显示 “已创建测试文件”,再显示 “文件已删除”(用
ls
查看,test_delete.txt
确实没了)。
- 预期结果:先显示 “已创建测试文件”,再显示 “文件已删除”(用
实践 2:用循环批量重命名文件(比如 “把 log1.txt 改成 note1.txt”)
- 先用之前的
create_files.sh
创建 10 个 log 文件(如果没删的话)。 - 创建脚本
rename_files.sh
:bash
nano rename_files.sh
- 粘贴内容:
bash
#!/bin/bash # 功能:把log1.txt到log10.txt重命名为note1.txt到note10.txt for i in {1..10}; do # 原文件名:log$i.txt,新文件名:note$i.txt mv "log${i}.txt" "note${i}.txt" echo "已把log${i}.txt改成note${i}.txt" done
- 加权限并运行,用
ls
查看,10 个文件真的从log*
变成note*
了!
(二)系统监控工具实践
-
打开终端,运行
vmstat 1
,然后在另一个终端复制一个大文件(比如把linux_study
目录打包):bash
tar -zcvf test.tar.gz ~/linux_study # 模拟磁盘读写
观察
vmstat
的wa
值,会发现它升高了(因为磁盘在忙)。 -
运行
iostat 1
,同时执行上面的打包命令,观察kB_wrtn/s
(每秒写速度)的变化。 -
运行
netstat -tuln
,找到ssh
服务的端口(22),确认它在 “监听”(LISTEN
状态)。
四、总结(今天必记 3 个重点)
-
Shell 脚本:
if [ 条件 ]; then ... else ... fi
:实现 “如果... 就... 否则...” 的逻辑(条件里的符号前后必须有空格!)。for i in {1..10}; do ... done
:重复执行命令(批量操作超方便)。
-
系统监控:
- 卡慢先看
vmstat
的r
(CPU 队列)和free
(内存)。 - 磁盘慢看
iostat
的tps
(磁盘繁忙度)。 - 网络异常看
netstat -tuln
(谁在监听端口)。
- 卡慢先看
-
所有命令都别怕错,多运行几次,观察输出变化,慢慢就熟了~