什么是 Shell 脚本?
Shell 脚本就是把一串命令写进一个文件里,一次性执行。与其每天手动敲 20 条重复命令,不如写一个脚本一劳永逸。
举个例子,每天备份网站需要:进目录→打包→传到备份服务器→删除旧备份。把这些命令写进一个 backup.sh,之后只用执行 ./backup.sh 即可。配合 crontab 定时任务,甚至可以全自动运行。
第一个 Shell 脚本
新建文件 hello.sh:
#!/bin/bash
# 这是我的第一个脚本
echo "Hello, LinuxML!"
echo "当前时间: $(date)"
echo "当前用户: $(whoami)"
保存后赋予执行权限并运行:
chmod +x hello.sh
./hello.sh
第一行 #!/bin/bash 叫 Shebang,告诉系统用哪个解释器执行这个脚本。必须写在第一行。
变量
定义变量等号两边不能有空格(这是新手最常见的坑):
#!/bin/bash
name="LinuxML"
count=100
echo "网站名: $name"
echo "命令数: $count"
获取命令输出用 $():
today=$(date +%Y-%m-%d)
echo "今天是: $today"
用户输入用 read:
echo -n "请输入你的名字: "
read username
echo "你好, $username!"
条件判断 if
if 语句的语法:
#!/bin/bash
if [ 条件 ]; then
命令
elif [ 条件 ]; then
命令
else
命令
fi
常用条件:
- 数值比较:
-eq等于、-ne不等于、-gt大于、-lt小于、-ge大于等于、-le小于等于 - 字符串比较:
=等于、!=不等于、-z为空、-n非空 - 文件判断:
-f是普通文件、-d是目录、-e存在、-r可读、-w可写、-x可执行
实战:备份脚本(检查磁盘空间)
#!/bin/bash
backup_dir="/backup"
# 检查磁盘空间是否充足
available=$(df "$backup_dir" | tail -1 | awk '{print $4}')
if [ "$available" -lt 1048576 ]; then
echo "磁盘空间不足,无法备份!"
exit 1
fi
echo "磁盘空间充足,开始备份..."
# tar -czf "$backup_dir/site-$(date +%Y%m%d).tar.gz" /var/www
循环
for 循环:遍历列表
#!/bin/bash
# 批量创建 10 个目录
for i in {1..10}; do
mkdir -p "project_$i"
echo "已创建 project_$i"
done
while 循环:按条件重复
#!/bin/bash
# 监控某个进程是否存活
while true; do
if ! pgrep nginx > /dev/null; then
echo "$(date): Nginx 挂了,正在重启..."
systemctl restart nginx
fi
sleep 60
done
函数
把重复的逻辑封装成函数:
#!/bin/bash
# 定义函数
log_msg() {
echo "[$(date +%H:%M:%S)] $1"
}
# 使用函数
log_msg "开始执行任务..."
# ...你的代码...
log_msg "任务执行完毕"
实战脚本合集(可直接使用)
1. 自动备份脚本
#!/bin/bash
src="/var/www"
dst="/backup/www-$(date +%Y%m%d-%H%M%S).tar.gz"
tar -czf "$dst" "$src" && echo "备份完成: $dst" || echo "备份失败!"
# 删除 7 天前的旧备份
find /backup -name "*.tar.gz" -mtime +7 -delete
2. 批量重命名文件
#!/bin/bash
# 把当前目录下所有 .jpeg 改为 .jpg
for file in *.jpeg; do
mv "$file" "${file%.jpeg}.jpg"
done
echo "重命名完成"
3. 监控 CPU 和内存报警
#!/bin/bash
cpu=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
mem=$(free | grep Mem | awk '{printf "%.0f", $3/$2*100}')
if [ "${cpu%.*}" -gt 90 ]; then
echo "警告: CPU 使用率 ${cpu}%"
fi
if [ "$mem" -gt 90 ]; then
echo "警告: 内存使用率 ${mem}%"
fi
4. 一键部署脚本
#!/bin/bash
# 拉代码 → 安装依赖 → 重启服务
cd /var/www/myapp || exit 1
git pull origin main
composer install --no-dev
systemctl restart php-fpm
echo "部署完成!"
定时执行:crontab
写完脚本后,用 crontab 让它定时自动运行:
crontab -e
添加一行(分 时 日 月 周 命令):
# 每天凌晨 3 点执行备份脚本
0 3 * * * /home/user/backup.sh
# 每 5 分钟检查一次服务状态
*/5 * * * * /home/user/check_service.sh
查看已设置的定时任务:crontab -l