【跟我学Linxu】第七天:Shell 脚本进阶 + 系统监控工具

一、学习目标

  1. Shell 脚本进阶:给脚本加 “判断逻辑”(比如 “如果文件存在就做 A,不存在就做 B”)和 “循环操作”(比如 “批量创建 10 个文件”),让脚本更智能。
  2. 系统监控工具:除了之前的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

操作步骤

  1. 创建脚本:nano ~/linux_study/check_disk.sh,粘贴上面内容。
  2. 加权限:chmod +x check_disk.sh
  3. 运行:./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

操作步骤

  1. 创建脚本:nano ~/linux_study/create_files.sh,粘贴内容。
  2. 加权限:chmod +x create_files.sh
  3. 运行:./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

操作步骤

  1. 确保linux_study目录下有几个.txt 文件(比如之前的day1_note.txt等)。
  2. 创建脚本并运行,用cat day1_note.txt查看,末尾真的多了一行文字!

(二)系统监控工具:3 个命令快速找 “卡慢原因”

之前学了top看进程,今天学 3 个更细分的工具,分别看 “系统整体状态”“磁盘速度”“网络连接”。

1. vmstat:看系统 “整体健康度”(CPU / 内存 / IO 是否繁忙)

作用:像 “医院的全身检查报告”,一眼看出 CPU 是否满了、内存是否够用、磁盘读写是否频繁。

操作步骤

  1. 终端输入命令(1表示每秒刷新一次):

    bash

    vmstat 1
    
  2. 输出解读(只看前 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),说明磁盘读写太慢(比如复制大文件时)。
  3. Ctrl+C退出监控。
2. iostat:看 “磁盘读写速度”(找 “复制文件慢” 的原因)

作用:专门监控磁盘的 “读写速度” 和 “繁忙程度”,比如复制文件特别慢时,用它看是不是磁盘卡了。

操作步骤

  1. 先安装(Ubuntu 默认没有):

    bash

    sudo apt install sysstat  # 输入密码后按y
    
  2. 运行命令(1表示每秒刷新一次):

    bash

    iostat 1
    
  3. 输出解读(重点看磁盘部分):

    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”“用了哪个端口”),排查异常联网。

操作步骤

  1. 先安装(Ubuntu 默认没有):

    bash

    sudo apt install net-tools  # 输入密码后按y
    
  2. 查看所有网络连接(加-tuln只看 “正在监听的端口”,更清晰):

    bash

    netstat -tuln
    
  3. 输出解读(重点看 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:写一个 “判断文件是否存在,存在就删除” 的脚本
  1. 进入linux_study目录:

    bash

    cd ~/linux_study
    
  2. 创建脚本delete_if_exists.sh

    bash

    nano delete_if_exists.sh
    
  3. 粘贴以下内容(逐行解释写在注释里):

    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
    
  4. 保存退出(Ctrl+O→回车→Ctrl+X)。
  5. 加执行权限:

    bash

    chmod +x delete_if_exists.sh
    
  6. 运行脚本:

    bash

    ./delete_if_exists.sh
    
     
    • 预期结果:先显示 “已创建测试文件”,再显示 “文件已删除”(用ls查看,test_delete.txt确实没了)。
实践 2:用循环批量重命名文件(比如 “把 log1.txt 改成 note1.txt”)
  1. 先用之前的create_files.sh创建 10 个 log 文件(如果没删的话)。
  2. 创建脚本rename_files.sh

    bash

    nano rename_files.sh
    
  3. 粘贴内容:

    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
    
  4. 加权限并运行,用ls查看,10 个文件真的从log*变成note*了!

(二)系统监控工具实践

  1. 打开终端,运行vmstat 1,然后在另一个终端复制一个大文件(比如把linux_study目录打包):

    bash

    tar -zcvf test.tar.gz ~/linux_study  # 模拟磁盘读写
    
     

    观察vmstatwa值,会发现它升高了(因为磁盘在忙)。

  2. 运行iostat 1,同时执行上面的打包命令,观察kB_wrtn/s(每秒写速度)的变化。

  3. 运行netstat -tuln,找到ssh服务的端口(22),确认它在 “监听”(LISTEN状态)。

四、总结(今天必记 3 个重点)

  1. Shell 脚本

    • if [ 条件 ]; then ... else ... fi:实现 “如果... 就... 否则...” 的逻辑(条件里的符号前后必须有空格!)。
    • for i in {1..10}; do ... done:重复执行命令(批量操作超方便)。
  2. 系统监控

    • 卡慢先看vmstatr(CPU 队列)和free(内存)。
    • 磁盘慢看iostattps(磁盘繁忙度)。
    • 网络异常看netstat -tuln(谁在监听端口)。
  3. 所有命令都别怕错,多运行几次,观察输出变化,慢慢就熟了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值