好的,阿杰,我给你整理一个 Linux 下的 Shell 脚本基础教程,覆盖常用概念、语法、控制结构和实用示例。


🐚 Linux Shell 脚本基础

1️⃣ 什么是 Shell 脚本

  • Shell:Linux 下的命令解释器(常见 bash、sh、zsh)
  • Shell 脚本:由一系列命令组成的文本文件,用来自动化任务
  • 文件扩展名:通常 .sh

2️⃣ 创建和运行 Shell 脚本

1. 创建文件

touch script.sh
chmod +x script.sh  # 添加可执行权限

2. 编写脚本示例

#!/bin/bash
# 这是一个注释
echo "Hello, Linux Shell!"

  • #!/bin/bash:指定脚本使用 bash 解释器
  • echo:输出文本

3. 运行脚本

./script.sh
# 或者
bash script.sh


3️⃣ 变量

# 定义变量
name="阿杰"
age=25

# 使用变量
echo "姓名: $name, 年龄: $age"

  • 变量名不要有空格
  • 使用 $ 来引用变量

4️⃣ 读取用户输入

read -p "请输入你的名字: " username
echo "你好, $username!"


5️⃣ 条件判断

if 语句

num=10
if [ $num -gt 5 ]; then
    echo "大于5"
else
    echo "小于等于5"
fi

  • 常用比较符号:
符号含义
-eq等于
-ne不等于
-gt大于
-lt小于
-ge大于等于
-le小于等于

case 语句

fruit="apple"
case $fruit in
    "apple")
        echo "这是苹果";;
    "banana")
        echo "这是香蕉";;
    *)
        echo "未知水果";;
esac


6️⃣ 循环

for 循环

for i in 1 2 3 4 5
do
    echo "循环次数: $i"
done

  • 也可用范围:
for i in {1..5}; do echo $i; done

while 循环

count=1
while [ $count -le 5 ]
do
    echo "计数: $count"
    count=$((count + 1))
done


7️⃣ 函数

greet() {
    echo "Hello, $1"
}

greet "阿杰"  # 调用函数并传参


8️⃣ 文件和目录操作

# 创建目录
mkdir test_dir

# 创建文件
touch test_dir/file.txt

# 写入文件
echo "Hello" > test_dir/file.txt

# 追加写入
echo "World" >> test_dir/file.txt

# 读取文件
cat test_dir/file.txt


9️⃣ 脚本调试

bash -x script.sh   # 显示每条命令执行过程


10️⃣ 综合示例:备份脚本

#!/bin/bash
# 备份 home 目录到 /backup

SRC="/home/username"
DEST="/backup/home_backup_$(date +%F).tar.gz"

tar -czf $DEST $SRC

echo "备份完成: $DEST"

  • 自动生成日期
  • 压缩备份目录

👌 好的,阿杰,我帮你整理一个 Linux 高级 Shell 脚本示例集,涵盖自动化部署、日志分析、文件批量处理、条件报警,以及循环和函数的综合应用。


🐚 Linux 高级 Shell 脚本示例集


1️⃣ 自动化部署示例

功能:自动拉取 Git 仓库代码并重启服务

#!/bin/bash
# 自动部署脚本

APP_DIR="/var/www/myapp"
GIT_REPO="git@github.com:username/myapp.git"
SERVICE_NAME="myapp.service"

echo "开始部署..."
cd $APP_DIR || exit
git fetch --all
git reset --hard origin/main
git pull

echo "重启服务..."
sudo systemctl restart $SERVICE_NAME

echo "部署完成!"

  • 用途:自动更新应用代码并重启服务
  • 结合 cron,可定时自动部署

2️⃣ 日志分析示例

功能:统计 Apache 日志中 404 错误访问次数

#!/bin/bash
LOG_FILE="/var/log/apache2/access.log"
ERROR_COUNT=$(grep " 404 " $LOG_FILE | wc -l)
echo "当前 404 错误次数: $ERROR_COUNT"

# 输出出现最多的 5 个请求 URL
echo "Top 5 404 URL:"
grep " 404 " $LOG_FILE | awk '{print $7}' | sort | uniq -c | sort -nr | head -5

  • 用途:快速定位网站错误
  • 可结合 crontab 自动每日统计

3️⃣ 文件批量处理示例

功能:批量重命名目录下所有 .txt 文件

#!/bin/bash
DIR="/home/username/docs"
COUNTER=1

for FILE in $DIR/*.txt; do
    BASENAME=$(basename "$FILE")
    mv "$FILE" "$DIR/file_$COUNTER.txt"
    ((COUNTER++))
done

echo "批量重命名完成"

  • 用途:整理大量文件
  • 结合正则表达式,可处理复杂命名规则

4️⃣ 条件报警示例

功能:监控磁盘使用率,超过阈值发送邮件

#!/bin/bash
THRESHOLD=80
MAIL="admin@example.com"

USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')

if [ "$USAGE" -gt "$THRESHOLD" ]; then
    echo "磁盘使用率警告: $USAGE%" | mail -s "Disk Alert" $MAIL
fi

  • 用途:服务器监控
  • 可结合 cron 定期检查

5️⃣ 循环与函数综合应用示例

功能:批量检查服务状态,并自动重启未运行服务

#!/bin/bash
SERVICES=("nginx" "mysql" "redis")

check_service() {
    local svc=$1
    systemctl is-active --quiet $svc
    if [ $? -ne 0 ]; then
        echo "$svc 未运行,正在重启..."
        sudo systemctl restart $svc
    else
        echo "$svc 正常运行"
    fi
}

for svc in "${SERVICES[@]}"; do
    check_service $svc
done

  • 用途:服务器运维自动化
  • 使用函数封装逻辑,循环遍历服务

6️⃣ 综合示例:自动备份 + 日志记录 + 邮件通知

#!/bin/bash
SRC="/home/username/data"
DEST="/backup/data_$(date +%F).tar.gz"
LOG="/var/log/backup.log"
MAIL="admin@example.com"

tar -czf $DEST $SRC
if [ $? -eq 0 ]; then
    echo "$(date) - 备份成功: $DEST" >> $LOG
    echo "备份成功: $DEST" | mail -s "Backup Success" $MAIL
else
    echo "$(date) - 备份失败" >> $LOG
    echo "备份失败" | mail -s "Backup Failed" $MAIL
fi

  • 自动压缩数据目录
  • 日志记录备份状态
  • 邮件通知管理员

✅ 总结

这个高级脚本集展示了:

  • 自动化部署、日志分析、文件批量处理、条件报警
  • 循环、条件判断和函数综合应用
  • 可以与 cron 作业 配合,实现定时任务
  • 适合 服务器运维、系统管理、自动化运维脚本