当前位置:首页>Linux>【Linux 运维体系 · 第 12 篇】Shell 脚本入门到实战 —— 运维为什么一定要会写脚本?

【Linux 运维体系 · 第 12 篇】Shell 脚本入门到实战 —— 运维为什么一定要会写脚本?

  • 2026-10-11 06:16:37
【Linux 运维体系 · 第 12 篇】Shell 脚本入门到实战 —— 运维为什么一定要会写脚本?

本篇目标

  • • 理解为什么运维必须会 Shell
  • • 编写简单脚本
  • • 使用变量、判断、循环
  • • 写自动化脚本
  • • 学会排查脚本问题

一、为什么运维一定要学 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

自动化后:

每天执行

↓

自动生成备份

↓

减少人工操作

十二、本篇总结

运维写脚本,不是为了炫技,而是为了把重复劳动交给机器。

最新文章

随机文章