12 · 实战脚本合集
目标:把前面 11 节的知识串起来,写出能用的脚本
🎯 三个循序渐进的小项目
项目 1 · 系统信息面板 🟢
综合运用:变量、$( ) 命令替换、echo -e 彩色输出。
#!/bin/bash
# system-info.sh — 打印系统信息
# 颜色定义
GREEN='\033[0;32m'
NC='\033[0m'
echo -e "${GREEN}===== 系统信息 =====${NC}"
echo "主机名:$(hostname)"
echo "当前用户:$USER"
echo "当前时间:$(date '+%Y-%m-%d %H:%M:%S')"
echo "内核版本:$(uname -r)"
echo "磁盘使用:$(df -h / | tail -1 | awk '{print $5}')"
知识点:$( ) 命令替换、变量引用、echo -e 转义、管道。
项目 2 · 参数化脚本(带帮助与校验)🟡
综合运用:特殊变量、case、if、函数、exit。
#!/bin/bash
# greet.sh — 打招呼脚本
# 用法: ./greet.sh <名字> [次数]
usage() {
echo "用法: $0 <名字> [次数]"
exit 1
}
# 参数校验
if [ $# -lt 1 ]; then
usage
fi
name=$1
count=${2:-1} # 默认值 1
# 校验次数是数字
if ! [[ "$count" =~ ^[0-9]+$ ]]; then
echo "错误:次数必须是数字"
exit 1
fi
greet() {
local n=$1
local who=$2
for (( i=1; i<=n; i++ )); do
echo "[$i] 你好, $who !"
done
}
greet "$count" "$name"
知识点:$# $1 $0、${2:-1} 默认值、<span class="deadlink">=~</span> 正则、local 局部变量、for (( ))、函数。
项目 3 · 批量文件备份工具 🔴
综合运用:文件测试、循环、日期、重定向、错误处理。
#!/bin/bash
# backup.sh — 把指定目录打包备份
# 用法: ./backup.sh <源目录> [备份目录]
set -e # 遇错即停
src=${1:?"错误:请指定源目录"}
dst=${2:-./backups}
# 检查源目录存在
if [ ! -d "$src" ]; then
echo "错误:$src 不是目录" >&2
exit 1
fi
mkdir -p "$dst"
# 生成带日期的压缩包
stamp=$(date +%Y%m%d_%H%M%S)
name=$(basename "$src")
archive="$dst/${name}_${stamp}.tar.gz"
tar -czf "$archive" "$src" 2>/dev/null
if [ $? -eq 0 ]; then
size=$(du -h "$archive" | cut -f1)
echo "✅ 备份成功:$archive($size)"
else
echo "❌ 备份失败" >&2
exit 1
fi
# 清理 7 天前的旧备份
find "$dst" -name "*.tar.gz" -mtime +7 -delete
echo "已清理 7 天前的旧备份"
知识点:set -e、${1:?} 必填校验、>&2 错误流、$(date)、basename、$?、find -mtime。
📊 知识点覆盖对照
| 项目 | 变量 | 参数 | 条件 | 循环 | 函数 | 重定向 |
|---|---|---|---|---|---|---|
| 系统面板 | ✅ | — | — | — | — | — |
| 参数脚本 | ✅ | ✅ | ✅ | ✅ | ✅ | — |
| 备份工具 | ✅ | ✅ | ✅ | ✅ | — | ✅ |
🌙 今日作业
- [ ] 跑通项目 1,改成显示内存占用
- [ ] 给项目 2 加一个
-h帮助选项 - [ ] 挑战:给项目 3 加上「保留最近 5 份备份」的逻辑
🔗 关联
Shell-学习总览|上一课 → 11-文件包含|下一课 → 13-Shell易错点速查