shell脚本是将运维手动操作自动化,核心是掌握基础命令、变量判断及脚本组合;需以#!/bin/bash开头,设执行权限,支持条件判断、循环、参数传递、错误退出、交互确认和日志记录。

写 Shell 脚本不是写程序,而是把运维中重复的手动操作自动化——比如查日志、清缓存、备份文件、监控服务状态。核心就三点:会用基础命令、懂变量和判断、能组合成可执行的文件。
从一个能跑起来的脚本开始
新建一个文本文件,比如 backup.sh,第一行必须是:
#!/bin/bash
这叫“shebang”,告诉系统用 bash 解释器运行它。
接着写一句简单命令,比如:
echo "正在执行备份..."
保存后,在终端里给它执行权限:
chmod +x backup.sh
然后直接运行:
./backup.sh
让脚本能“看情况做事”:条件判断和循环
运维脚本常要判断环境是否满足。比如检查某个进程是否存在:
if pgrep nginx > /dev/null; then
echo "Nginx 正在运行"
else
echo "Nginx 未运行,尝试启动..."
systemctl start nginx
fi
再比如批量处理日志文件:
for file in /var/log/*.log; do
if [ -s "$file" ]; then
gzip "$file"
fi
done
传参数、记日志、防手滑:让脚本更可靠
别让脚本“一跑到底”。加点保护机制:
- 用 $1 $2 接收命令行参数,比如 ./deploy.sh v2.1 /opt/app 中,$1 就是 v2.1
- 用 set -e 开头,让脚本遇到任意命令失败就立刻退出,避免错误累积
- 关键操作前加确认提示:read -p "确定要重启数据库?(y/N) " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] && systemctl restart mysql
- 把执行过程记进日志:echo "$(date): 备份完成" >> /var/log/backup.log
常见场景直接套用(可复制修改)
以下代码片段可直接放进你的脚本里:
检查磁盘空间并告警:
used=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $used -gt 85 ]; then
echo "警告:根分区使用率 $used%" | mail -s "磁盘告警" admin@example.com
fi
每天凌晨自动清理 7 天前的 .tmp 文件:
find /tmp -name "*.tmp" -mtime +7 -delete
检测端口是否监听(如 3306):
if ! ss -tuln | grep ':3306' > /dev/null; then
systemctl restart mysql
fi










