返回文章列表
Linux 学习笔记(三):自动化与实战
2026年6月26日14 分钟阅读
接上一篇 [[Linux 学习笔记(二):进阶操作与系统管理]],本篇涵盖环境变量、Shell 脚本、终端美化和实战场景。
第六周:环境与进阶
深入环境变量、磁盘管理、后台任务。
6.1 环境变量
bash1env # 查看所有环境变量 2echo $变量名 # 读取 3echo ${变量名}ABC # 拼接输出(用 {} 区分边界)
临时设置:
bash1export 变量名=变量值 2export MY_VAR=hello
永久设置:
| 作用范围 | 配置文件 | 说明 |
|---|---|---|
| 当前用户 | ~/.bashrc | 普通用户编辑 |
| 所有用户 | /etc/profile | root 编辑 |
bash1# 修改后立即生效 2source ~/.bashrc
自定义 PATH:
bash1export PATH=$PATH:/自定义目录 2# 写入 ~/.bashrc 永久生效
6.2 date — 时间计算与格式化
bash1date # 当前时间 2date -d "+2 hour" +"%Y-%m-%d %H:%M:%S" # 2 小时后 3date -d "yesterday" +%F # 昨天 4date -d "@1719360000" # 时间戳转日期
| 标记 | 含义 | 示例 |
|---|---|---|
%Y | 4 位年份 | 2026 |
%m | 月份 | 06 |
%d | 日期 | 26 |
%H | 小时 | 22 |
%M | 分钟 | 00 |
%S | 秒 | 00 |
%F | %Y-%m-%d 简写 | 2026-06-26 |
%s | Unix 时间戳 | 1719360000 |
6.3 ln — 链接
bash1ln -s 源文件 链接名 # 软链接(快捷方式) 2ln 源文件 链接名 # 硬链接
- 软链接:指向文件路径,源文件删除则失效,可跨文件系统
- 硬链接:指向文件 inode,源文件删除仍有效,不可跨文件系统
6.4 mount / umount / lsblk — 磁盘与挂载
bash1lsblk # 以树形显示磁盘和分区 2lsblk -f # 显示文件系统类型和 UUID 3 4mount /dev/sdb1 /mnt # 挂载分区到 /mnt 5mount -o ro /dev/sdb1 /mnt # 只读挂载 6umount /mnt # 卸载 7umount -l /mnt # 强制卸载
6.5 dd — 磁盘复制
bash1dd if=/dev/sda of=/dev/sdb bs=4M status=progress # 磁盘克隆 2dd if=/dev/zero of=test.img bs=1M count=100 # 创建 100MB 测试文件
6.6 后台任务
bash1命令 & # 放入后台运行 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 — 查看打开的文件
bash1lsof -i :8080 # 谁占用了 8080 端口 2lsof -u 用户名 # 某用户打开的文件 3lsof -p PID # 某进程打开的文件 4lsof 文件名 # 谁正在使用这个文件
6.8 watch — 周期性执行命令
bash1watch -n 1 df -h # 每秒刷新磁盘占用 2watch -d ls -l # 高亮显示变化
6.9 iostat / sar — 进阶监控
bash1# iostat — 磁盘 IO 2iostat -x 2 3 # 每 2 秒刷新,输出 3 次 3 4# sar — 网络流量 5sar -n DEV 2 3 # 每 2 秒刷新网卡流量,输出 3 次
6.10 uname — 系统信息
bash1uname -a # 内核版本、主机名、架构等全部信息
6.11 杂项工具
bash1cal # 当前月份日历 2cal 2026 # 全年 3 4expr 1 + 2 # 整数加法 5expr 2 \* 3 # 乘法(* 需转义) 6 7figlet "Hello" # ASCII 艺术字 8figlet -f slant "标题" # 斜体字体
练一练 1
- 在
~/.bashrc中添加一个别名ll='ls -lh',然后用source使其生效 - 用
date +%Y%m%d -d "-1 day"输出昨天的日期(格式如 20260625) - 创建一个 10MB 的测试文件(用
dd),然后删除 - 用
lsof -i :22查看谁在使用 SSH 端口 - 运行
sleep 60 &,然后用jobs查看,再用fg切到前台
第七周:Shell 脚本基础
从敲命令到写脚本,学会自动化。
7.1 第一个脚本
bash1#!/bin/bash 2echo "Hello, Linux!"
- 保存为
hello.sh - 加执行权限:
chmod +x hello.sh - 运行:
./hello.sh
#!/bin/bash 称为 shebang,告诉系统用哪个解释器执行。
7.2 变量
bash1# 定义变量(等号两边不能有空格) 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 字符串
bash1str="hello" 2echo ${#str} # 长度 → 5 3echo ${str:0:2} # 切片 → "he" 4echo ${str/ll/LL} # 替换 → "heLLo" 5echo ${str^^} # 转大写 → "HELLO"
7.4 数组
bash1arr=("apple" "banana" "cherry") 2echo ${arr[0]} # 第一个元素 3echo ${arr[@]} # 所有元素 4echo ${#arr[@]} # 元素个数 5arr+=("date") # 追加
7.5 条件判断
bash1if [ "$1" = "start" ]; then 2 echo "starting..." 3elif [ "$1" = "stop" ]; then 4 echo "stopping..." 5else 6 echo "usage: $0 start|stop" 7fi
常用文件判断:
bash1[ -f "file" ] # 是否为文件 2[ -d "dir" ] # 是否为目录 3[ -e "path" ] # 是否存在 4[ -z "$var" ] # 是否为空字符串 5[ "$a" = "$b" ] # 字符串相等 6[ $n -gt 10 ] # 数字大于(-lt 小于,-eq 等于)
7.6 循环
bash1# 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 函数
bash1# 定义 2log() { 3 local msg=$1 4 echo "[$(date +'%Y-%m-%d %H:%M:%S')] $msg" 5} 6 7# 调用 8log "系统启动完成"
7.8 算术运算
bash1a=10; b=3 2echo $((a + b)) # 加法 3echo $((a - b)) # 减法 4echo $((a * b)) # 乘法 5echo $((a / b)) # 除法 6echo $((a % b)) # 取模 7echo $((a ** 2)) # 平方
7.9 退出码
bash1ls /nonexist 2echo $? # 上一条命令的退出码(0=成功,非0=失败) 3 4# 脚本中指定退出码 5if [ -f "$1" ]; then 6 exit 0 7else 8 exit 1 9fi
7.10 完整示例:备份脚本
bash1#!/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
- 写一个脚本
hello.sh,接收一个名字参数,输出 "你好, [名字]!" - 写一个脚本
countdown.sh,从 10 倒数到 1,每秒输出一个数字(提示:sleep 1) - 写一个脚本
batch_rename.sh,将当前目录所有.txt改为.md - 写一个脚本
check_port.sh,接收端口号参数,用ss -tlnp检查端口是否被监听
附录:终端美化与 dotfiles
配置你的终端,让它更好看、更好用。
什么是 dotfiles
以 . 开头的配置文件,控制 shell、编辑器、git 等工具的行为。
| 文件 | 作用 |
|---|---|
~/.bashrc | Bash 配置(别名、函数、提示符) |
~/.bash_profile | 登录 shell 配置 |
~/.gitconfig | Git 配置 |
~/.vimrc | Vim 配置 |
~/.ssh/config | SSH 快捷配置 |
修改 PS1 提示符
bash1# 当前样式 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 配置
bash1# 别名 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"; }
推荐终端工具
| 工具 | 安装 | 说明 |
|---|---|---|
| htop | apt install htop | top 的升级版,彩色+鼠标 |
| tmux | apt install tmux | 终端复用器 |
| bat | apt install bat | cat 替代,语法高亮 |
| ripgrep | apt install ripgrep | grep 替代,快数倍 |
| fd | apt install fd-find | find 替代,更快 |
| tldr | apt install tldr | 简化版 man |
bash1sudo apt install htop tmux ripgrep fd-find bat tldr
tmux 快速上手
bash1tmux new -s work # 创建会话 2tmux detach # 断开(Ctrl+B d) 3tmux attach -t work # 重连 4tmux ls # 列出会话
Ctrl+B 后: %垂直分屏 "水平分屏 方向键切换 d断开 c新建窗口 [滚动模式
终端美化配置片段
bash1# 加入 ~/.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:查找并清理大文件
bash1find / -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:实时监控日志并过滤关键词
bash1tail -f /var/log/syslog | grep --line-buffered "ERROR" 2grep "ERROR" /var/log/syslog | wc -l
场景 3:统计 IP 访问次数
bash1awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
场景 4:批量重命名
bash1for f in *.txt; do mv "$f" "${f%.txt}.md"; done 2for f in *.jpg; do mv "$f" "photo_$f"; done
场景 5:查找并杀死端口进程
bash1ss -tlnp | grep :8080 2kill -9 PID 3# 或一行搞定 4fuser -k 8080/tcp
场景 6:定时备份
bash1crontab -e 20 2 * * * tar -czf /bak/www_$(date +\%Y\%m\%d).tar.gz /var/www
场景 7:快速定位系统瓶颈
bash1ps -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 | 权限不足 | sudo 或 chmod |
command not found | 命令不存在或不在 PATH | apt 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