什么是 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