本篇目标
一、为什么运维一定要学 Shell?
很多新人觉得:
我会敲命令就够了
但现实很快会变成:
每天检查磁盘
↓
每天备份数据库
↓
每天清理日志
↓
每天查看服务状态
如果全部手动:
重复
容易错
浪费时间
Shell 脚本解决的是:
把重复工作交给机器。
运维写脚本不是为了成为开发。
而是为了:
减少重复劳动
↓
提高效率
↓
降低出错概率
二、第一个 Shell 脚本
创建文件:
vi hello.sh
写入:
#!/bin/bash
echo "hello linux"
执行:
bash hello.sh
或者:
chmod +x hello.sh
./hello.sh
输出:
hello linux
#!/bin/bash作用:
告诉系统用 bash 执行这个文件
三、变量是什么?
变量就是:
给数据起名字
例如:
#!/bin/bash
NAME="hakuna"
echo $NAME
输出:
hakuna
变量常见用途:
目录路径
数据库密码
文件名
IP地址
例如:
BACKUP_DIR="/backup"
mkdir -p $BACKUP_DIR
这样就可以做到只需要修改变量定义,所有其他引用的地方都会生效。
四、获取用户输入
脚本有时候需要交互。
示例:
#!/bin/bash
read -p "请输入用户名:" USER
echo "你好:$USER"
执行:
请输入用户名:admin
你好:admin
这样脚本就能接受动态参数。
五、条件判断
运维大量工作:
服务存在吗?
磁盘满了吗?
文件存在吗?
都需要判断。
例子:
#!/bin/bash
if [ -f /etc/passwd ]
then
echo "文件存在"
else
echo "文件不存在"
fi
常见判断:
文件:
-f 文件
目录:
-d 目录
字符串:
= 等于
!= 不等于
数字:
-eq 相等
-gt 大于
-lt 小于
六、循环
循环用于:
重复执行任务
最简单的例子:
for i in 1 2 3
do
echo $i
done
输出:
1
2
3
遍历文件:
for FILE in /backup/*
do
echo $FILE
done
对于下面这些工作,我们就非常适合使用遍历循环。
批量处理日志
批量备份
批量操作服务器
七、实战:检查服务是否运行
创建:
vi check_nginx.sh
写入:
#!/bin/bash
if systemctl is-active nginx \
>/dev/null
then
echo "nginx running"
else
echo "nginx stopped"
fi
运行:
bash check_nginx.sh
意义:
人工检查
↓
自动检查
这就是自动化第一步。
八、实战:自动清理旧日志
日志长期不清理:
磁盘爆满
↓
服务异常
↓
系统故障
创建脚本:
#!/bin/bash
find /var/log \
-name "*.log" \
-mtime +7 \
-delete
含义:
查找日志文件
↓
超过7天
↓
删除
以上shell会直接删除日志文件,为了避免误删,将shell做如下改进:
#!/bin/bash
LOG_DIR="/var/log"
DAYS=7
echo "正在查找 ${DAYS} 天前日志..."
FILES=$(find ${LOG_DIR} \
-type f \
-name "*.log" \
-mtime +${DAYS})
if [ -z "$FILES" ]
then
echo "未发现需要清理的日志"
exit 0
fi
echo ""
echo "以下文件将被删除:"
echo "$FILES"
echo ""
read -p "确认删除?(yes/no): " CONFIRM
if [ "$CONFIRM" != "yes" ]
then
echo "取消删除"
exit 0
fi
echo "$FILES" | while read FILE
do
rm -f "$FILE"
echo "已删除:$FILE"
done
echo ""
echo "清理完成"
赋予权限:
chmod +x clean_log.sh
运行:
./clean_log.sh
执行过程:
正在查找 7 天前日志
以下文件将被删除:
/var/log/test.log
/var/log/demo.log
确认删除?(yes/no):
输入:
yes
才会真正删除。
输入:
no
立即退出。
九、给脚本传参数
很多脚本需要:
脚本
+
参数
例子:
#!/bin/bash
echo $1
执行:
# 跟在脚本空格后面的就是参数,此处为nginx
bash demo.sh nginx
输出:
nginx
常见变量:
$1
第一个参数
$2
第二个参数
$#
参数数量
$@
全部参数
十、脚本报错怎么排查?
最常见:
权限错误
路径错误
变量错误
查看执行过程:
bash -x script.sh
会输出:
执行了什么
变量是什么
哪一步报错
例如:
bash -x backup.sh
这是运维排脚本最常用的方法之一。
十一、真实案例:自动备份目录
需求:
每天自动备份网站目录
创建:
vi backup_www.sh
脚本:
#!/bin/bash
DATE=$(date +%F)
tar czf \
/backup/www_${DATE}.tar.gz \
/data/www
运行:
bash backup_www.sh
结果:
www_2026-06-05.tar.gz
自动化后:
每天执行
↓
自动生成备份
↓
减少人工操作
十二、本篇总结
运维写脚本,不是为了炫技,而是为了把重复劳动交给机器。