返回文章列表

Linux 学习笔记(三):自动化与实战

2026年6月26日14 分钟阅读

接上一篇 [[Linux 学习笔记(二):进阶操作与系统管理]],本篇涵盖环境变量、Shell 脚本、终端美化和实战场景。


第六周:环境与进阶

深入环境变量、磁盘管理、后台任务。

6.1 环境变量

bash
1env                  # 查看所有环境变量
2echo $变量名          # 读取
3echo ${变量名}ABC     # 拼接输出(用 {} 区分边界)

临时设置:

bash
1export 变量名=变量值
2export MY_VAR=hello

永久设置:

作用范围配置文件说明
当前用户~/.bashrc普通用户编辑
所有用户/etc/profileroot 编辑
bash
1# 修改后立即生效
2source ~/.bashrc

自定义 PATH:

bash
1export PATH=$PATH:/自定义目录
2# 写入 ~/.bashrc 永久生效

6.2 date — 时间计算与格式化

bash
1date                        # 当前时间
2date -d "+2 hour" +"%Y-%m-%d %H:%M:%S"  # 2 小时后
3date -d "yesterday" +%F     # 昨天
4date -d "@1719360000"       # 时间戳转日期
标记含义示例
%Y4 位年份2026
%m月份06
%d日期26
%H小时22
%M分钟00
%S00
%F%Y-%m-%d 简写2026-06-26
%sUnix 时间戳1719360000

6.3 ln — 链接

bash
1ln -s 源文件 链接名        # 软链接(快捷方式)
2ln 源文件 链接名           # 硬链接
  • 软链接:指向文件路径,源文件删除则失效,可跨文件系统
  • 硬链接:指向文件 inode,源文件删除仍有效,不可跨文件系统

6.4 mount / umount / lsblk — 磁盘与挂载

bash
1lsblk                 # 以树形显示磁盘和分区
2lsblk -f              # 显示文件系统类型和 UUID
3
4mount /dev/sdb1 /mnt          # 挂载分区到 /mnt
5mount -o ro /dev/sdb1 /mnt    # 只读挂载
6umount /mnt                   # 卸载
7umount -l /mnt                # 强制卸载

6.5 dd — 磁盘复制

bash
1dd if=/dev/sda of=/dev/sdb bs=4M status=progress   # 磁盘克隆
2dd if=/dev/zero of=test.img bs=1M count=100         # 创建 100MB 测试文件

6.6 后台任务

bash
1命令 &                  # 放入后台运行
2nohup 命令 &            # 退出终端后继续运行
3nohup python script.py > out.log 2>&1 &  # 输出重定向到文件
4
5jobs                    # 查看后台任务列表
6jobs -l                 # 显示 PID
7fg %1                   # 把后台任务 1 切到前台
8bg %1                   # 把暂停的任务 1 放后台继续
9Ctrl + Z                # 暂停当前前台任务

6.7 lsof — 查看打开的文件

bash
1lsof -i :8080        # 谁占用了 8080 端口
2lsof -u 用户名        # 某用户打开的文件
3lsof -p PID          # 某进程打开的文件
4lsof 文件名           # 谁正在使用这个文件

6.8 watch — 周期性执行命令

bash
1watch -n 1 df -h       # 每秒刷新磁盘占用
2watch -d ls -l         # 高亮显示变化

6.9 iostat / sar — 进阶监控

bash
1# iostat — 磁盘 IO
2iostat -x 2 3   # 每 2 秒刷新,输出 3 次
3
4# sar — 网络流量
5sar -n DEV 2 3  # 每 2 秒刷新网卡流量,输出 3 次

6.10 uname — 系统信息

bash
1uname -a   # 内核版本、主机名、架构等全部信息

6.11 杂项工具

bash
1cal          # 当前月份日历
2cal 2026     # 全年
3
4expr 1 + 2          # 整数加法
5expr 2 \* 3         # 乘法(* 需转义)
6
7figlet "Hello"           # ASCII 艺术字
8figlet -f slant "标题"   # 斜体字体

练一练 1

  1. ~/.bashrc 中添加一个别名 ll='ls -lh',然后用 source 使其生效
  2. date +%Y%m%d -d "-1 day" 输出昨天的日期(格式如 20260625)
  3. 创建一个 10MB 的测试文件(用 dd),然后删除
  4. lsof -i :22 查看谁在使用 SSH 端口
  5. 运行 sleep 60 &,然后用 jobs 查看,再用 fg 切到前台

第七周:Shell 脚本基础

从敲命令到写脚本,学会自动化。

7.1 第一个脚本

bash
1#!/bin/bash
2echo "Hello, Linux!"
  1. 保存为 hello.sh
  2. 加执行权限:chmod +x hello.sh
  3. 运行:./hello.sh

#!/bin/bash 称为 shebang,告诉系统用哪个解释器执行。

7.2 变量

bash
1# 定义变量(等号两边不能有空格)
2name="Linux"
3echo $name
4echo ${name}_rocks    # 拼接时用 {} 包裹
5
6# 只读变量
7readonly version="1.0"
8
9# 位置参数
10echo "脚本名: $0"
11echo "第一个参数: $1"
12echo "第二个参数: $2"
13echo "参数个数: $#"
14echo "所有参数: $@"

7.3 字符串

bash
1str="hello"
2echo ${#str}                # 长度 → 5
3echo ${str:0:2}             # 切片 → "he"
4echo ${str/ll/LL}           # 替换 → "heLLo"
5echo ${str^^}               # 转大写 → "HELLO"

7.4 数组

bash
1arr=("apple" "banana" "cherry")
2echo ${arr[0]}              # 第一个元素
3echo ${arr[@]}              # 所有元素
4echo ${#arr[@]}             # 元素个数
5arr+=("date")               # 追加

7.5 条件判断

bash
1if [ "$1" = "start" ]; then
2    echo "starting..."
3elif [ "$1" = "stop" ]; then
4    echo "stopping..."
5else
6    echo "usage: $0 start|stop"
7fi

常用文件判断:

bash
1[ -f "file" ]    # 是否为文件
2[ -d "dir" ]     # 是否为目录
3[ -e "path" ]    # 是否存在
4[ -z "$var" ]    # 是否为空字符串
5[ "$a" = "$b" ]  # 字符串相等
6[ $n -gt 10 ]    # 数字大于(-lt 小于,-eq 等于)

7.6 循环

bash
1# for 循环
2for i in {1..5}; do
3    echo "Number: $i"
4done
5
6# for 遍历文件
7for file in *.txt; do
8    echo "处理: $file"
9done
10
11# while 循环
12count=1
13while [ $count -le 5 ]; do
14    echo "第 $count 次"
15    count=$((count + 1))
16done

7.7 函数

bash
1# 定义
2log() {
3    local msg=$1
4    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $msg"
5}
6
7# 调用
8log "系统启动完成"

7.8 算术运算

bash
1a=10; b=3
2echo $((a + b))      # 加法
3echo $((a - b))      # 减法
4echo $((a * b))      # 乘法
5echo $((a / b))      # 除法
6echo $((a % b))      # 取模
7echo $((a ** 2))     # 平方

7.9 退出码

bash
1ls /nonexist
2echo $?    # 上一条命令的退出码(0=成功,非0=失败)
3
4# 脚本中指定退出码
5if [ -f "$1" ]; then
6    exit 0
7else
8    exit 1
9fi

7.10 完整示例:备份脚本

bash
1#!/bin/bash
2
3source_dir=$1
4backup_dir="/backup"
5date_str=$(date +%Y%m%d_%H%M%S)
6
7if [ -z "$source_dir" ]; then
8    echo "用法: $0 <源目录>"
9    exit 1
10fi
11
12if [ ! -d "$source_dir" ]; then
13    echo "错误: $source_dir 不是有效目录"
14    exit 1
15fi
16
17mkdir -p "$backup_dir"
18tar -czf "${backup_dir}/backup_${date_str}.tar.gz" "$source_dir"
19
20if [ $? -eq 0 ]; then
21    echo "备份完成: ${backup_dir}/backup_${date_str}.tar.gz"
22else
23    echo "备份失败!"
24    exit 1
25fi

练一练 2

  1. 写一个脚本 hello.sh,接收一个名字参数,输出 "你好, [名字]!"
  2. 写一个脚本 countdown.sh,从 10 倒数到 1,每秒输出一个数字(提示:sleep 1
  3. 写一个脚本 batch_rename.sh,将当前目录所有 .txt 改为 .md
  4. 写一个脚本 check_port.sh,接收端口号参数,用 ss -tlnp 检查端口是否被监听

附录:终端美化与 dotfiles

配置你的终端,让它更好看、更好用。

什么是 dotfiles

. 开头的配置文件,控制 shell、编辑器、git 等工具的行为。

文件作用
~/.bashrcBash 配置(别名、函数、提示符)
~/.bash_profile登录 shell 配置
~/.gitconfigGit 配置
~/.vimrcVim 配置
~/.ssh/configSSH 快捷配置

修改 PS1 提示符

bash
1# 当前样式
2echo $PS1
3
4# 永久生效:将下面 export 加入 ~/.bashrc
5export PS1='\[\e[32m\]\u@\h\[\e[00m\]:\[\e[34m\]\w\[\e[00m\]\$ '

常用转义: \u用户名 \h主机名 \w路径 \$ #/$(root/普通) 颜色: 30黑 31红 32绿 33黄 34蓝 35紫 36青 37白

推荐的 ~/.bashrc 配置

bash
1# 别名
2alias ll='ls -lh'
3alias la='ls -la'
4alias ..='cd ..'
5alias rm='rm -i'
6alias grep='grep --color=auto'
7
8# 补全不区分大小写
9bind 'set completion-ignore-case on'
10
11# 彩色提示符
12export PS1='\[\e[32m\]\u@\h\[\e[00m\]:\[\e[34m\]\w\[\e[00m\]\$ '
13
14# 自定义函数:快速创建并进入目录
15mkcd() { mkdir -p "$1" && cd "$1"; }

推荐终端工具

工具安装说明
htopapt install htoptop 的升级版,彩色+鼠标
tmuxapt install tmux终端复用器
batapt install batcat 替代,语法高亮
ripgrepapt install ripgrepgrep 替代,快数倍
fdapt install fd-findfind 替代,更快
tldrapt install tldr简化版 man
bash
1sudo apt install htop tmux ripgrep fd-find bat tldr

tmux 快速上手

bash
1tmux new -s work      # 创建会话
2tmux detach           # 断开(Ctrl+B d)
3tmux attach -t work   # 重连
4tmux ls               # 列出会话

Ctrl+B 后: %垂直分屏 "水平分屏 方向键切换 d断开 c新建窗口 [滚动模式

终端美化配置片段

bash
1# 加入 ~/.bashrc
2
3# 用 bat 代替 cat
4if command -v batcat &> /dev/null; then
5    alias cat='batcat'
6fi
7
8# 快速编辑配置
9alias eb='vim ~/.bashrc'
10alias reload='source ~/.bashrc'

实战场景(命令组合)

将前面学过的命令组合起来,解决真实问题。

场景 1:查找并清理大文件

bash
1find / -type f -size +100M -exec ls -lh {} \; | sort -k5 -rh
2find /tmp -type f -size +100M -delete
3du -h --max-depth=1 / | sort -rh | head -10

场景 2:实时监控日志并过滤关键词

bash
1tail -f /var/log/syslog | grep --line-buffered "ERROR"
2grep "ERROR" /var/log/syslog | wc -l

场景 3:统计 IP 访问次数

bash
1awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

场景 4:批量重命名

bash
1for f in *.txt; do mv "$f" "${f%.txt}.md"; done
2for f in *.jpg; do mv "$f" "photo_$f"; done

场景 5:查找并杀死端口进程

bash
1ss -tlnp | grep :8080
2kill -9 PID
3# 或一行搞定
4fuser -k 8080/tcp

场景 6:定时备份

bash
1crontab -e
20 2 * * * tar -czf /bak/www_$(date +\%Y\%m\%d).tar.gz /var/www

场景 7:快速定位系统瓶颈

bash
1ps -aux --sort=-%cpu | head -10     # CPU 前 10
2ps -aux --sort=-%mem | head -10     # 内存前 10
3iostat -x 2 5                       # 磁盘 IO
4sar -n DEV 2 5                      # 网络流量

常见错误及解决方法

错误原因解决
Permission denied权限不足sudochmod
command not found命令不存在或不在 PATHapt install 或检查 PATH
No such file or directory路径错误ls 确认路径
Is a directory对目录用了文件操作-r
port already in use端口被占ss -tlnp | grep :端口 找进程
Disk quota exceeded磁盘满df -h 查看并清理
Connection refused服务未启动systemctl status 服务名
Connection timed out网络不通ping,再查防火墙

快速排查流程:

Permission denied  →  sudo 或 chmod
command not found  →  which 命令 or apt install
端口问题           →  ss -tlnp | grep :端口
磁盘满             →  df -h && du -sh /*
服务挂了           →  systemctl status 服务名
不知道问题在哪     →  journalctl -xe

发表评论