好的,阿杰,我给你整理一个 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 作业 配合,实现定时任务
- 适合 服务器运维、系统管理、自动化运维脚本
发表回复