12 · 实战脚本合集

2026.10.08 · 🔴

目标:把前面 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易错点速查