ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Linux运维必学:Shell脚本从入门到服务器巡检实战

Linux运维必学:Shell脚本从入门到服务器巡检实战 不知道你有没有过这样的经历刚接触 Linux 服务器面对黑乎乎的终端窗口除了ls、cd外不敢再敲别的命令运维同事一键跑完的部署脚本自己却连看都看不懂面试时被问到“会不会写 Shell 脚本”只能尴尬地说“会一点基础命令”。如果你正处于这个阶段这篇文章就是为你准备的。我会从 Shell 脚本最基础的概念开始一步步带你写出第一个可用的脚本再通过一个完整的服务器巡检实战案例把变量、判断、循环、函数、定时任务这些运维高频知识点串起来。文章里的每段代码都可以直接复制练习每个知识点都会说明“为什么这么做”。无论你是想转行 IT、刚入行运维还是在日常工作中需要批量处理服务器任务这篇保姆级教程都能帮你少走弯路。1. 为什么运维工程师必须掌握 Shell 脚本1.1 什么是 Shell 脚本先看一个非常简单的例子。你平时在 Linux 终端里敲命令比如查看当前目录下的文件ls -l如果你发现每次登录服务器都要执行一串固定命令比如先切换到项目目录、再激活环境、再启动服务那这些命令完全可以写进一个文本文件里然后用bash去执行它。这个文本文件就是 Shell 脚本。专业一点说Shell 既是一个命令解释器你把命令交给它它帮你调用操作系统内核去执行也是一种编程语言它支持变量、条件判断、循环、函数等语法。而 Shell 脚本就是把一组 Shell 命令和编程语法组合在一起实现自动化任务的脚本文件。1.2 运维工作里 Shell 脚本解决什么问题日常运维工作中有很大一部分是重复性工作。比如每天早上检查服务器磁盘使用率、内存使用率、CPU 负载。新上线一批服务器需要在每台机器上创建用户、配置环境变量、安装基础软件。日志文件越来越大需要定期清理 7 天前的旧日志。备份数据库文件并把备份文件同步到远程服务器。这些任务如果全部手动操作不仅效率低还容易漏掉步骤。而 Shell 脚本可以一次性把这些命令固化下来下次只要执行一个脚本就能完成全部操作。规模大了之后还能配合crontab定时执行实现无人值守。1.3 常见的 Shell 类型Linux 中常见的 Shell 有bash、sh、zsh、csh等。其中bashBourne Again Shell是目前大多数 Linux 发行版默认的 Shell也是我们教程中使用的 Shell。你可以通过下面命令查看当前系统默认的 Shellecho $SHELL在绝大多数场景下你只需要掌握bash就足够了。脚本文件第一行写#!/bin/bash意思是告诉系统用哪个解释器来执行这个脚本这在脚本有可执行权限时尤为重要。技术提示sh在很多系统上只是bash的一种兼容模式两者语法大部分一致但存在细微差别。为了减少兼容性问题新写的脚本建议明确写#!/bin/bash。2. 环境准备搭建你的第一个 Shell 练习环境2.1 操作系统要求学习 Shell 脚本你并不需要一台配置很高的服务器。只要你手头有任意一种 Linux 环境即可常见选择包括CentOS / Rocky Linux / AlmaLinux服务器运维常用Ubuntu / Debian开发者常用云服务器阿里云、腾讯云、华为云等虚拟机软件安装 LinuxVMware、VirtualBoxWindows 自带的 WSL适用于 Windows 的 Linux 子系统如果你之前完全没有 Linux 环境建议先在本地装一个虚拟机或者直接购买一台低配云服务器。学习阶段无需安装图形桌面版使用最小化安装Minimal即可这样反而更贴近真实服务器环境。2.2 版本说明当前主流 Linux 发行版内置的 bash 版本通常为 4.x 或 5.x。你可以执行下面的命令查看bash --version本文示例以常见的 bash 4.x/5.x 环境为例。由于 Shell 语法本身非常稳定这些示例在绝大多数现代 Linux 系统上都能正常运行。如果你的系统较老或者使用了特殊 Shell需要根据实际情况调整。2.3 准备一个练习目录和编辑器建议在服务器上创建一个专门存放脚本的目录方便统一管理mkdir -p ~/shell-practice cd ~/shell-practice编辑器方面Linux 终端中最常用的是vi/vim。如果你对 vim 不熟悉可以先使用nano操作更简单。之后在服务器上操作时再慢慢熟悉 vim。如果你使用的是本地终端工具也可以用 VSCode 连接远程服务器编辑脚本体验更好。2.4 给脚本添加执行权限创建一个脚本文件hello.shvi hello.sh编辑内容#!/bin/bash echo Hello, Linux 运维学习!保存退出后执行方式有两种# 方式一使用 bash 解释器执行推荐新手先用这种 bash hello.sh # 方式二给脚本添加执行权限后直接运行 chmod x hello.sh ./hello.sh初学者经常遇到Permission denied的报错就是因为没有执行权限。上面两种方式你都要掌握方式一不需要给执行权限适合快速测试方式二更符合真实项目中的习惯。运行结果Hello, Linux 运维学习!到这里你的第一个 Shell 脚本已经跑通了。接下来我们开始系统学习核心语法。3. Shell 脚本核心语法详解3.1 变量存储与使用Shell 变量不需要提前声明类型直接赋值即可。命名规则和大多数编程语言类似只能由字母、数字、下划线组成不能以数字开头不能包含空格和特殊字符。#!/bin/bash # 定义变量等号两边不能有空格 namezhangsan version1.0.0 count10 # 使用变量建议加上花括号 echo 用户名: ${name} echo 当前版本: ${version} echo 数量: ${count} # 修改变量的值 count20 echo 修改后的数量: ${count}输出结果用户名: zhangsan 当前版本: 1.0.0 数量: 10 修改后的数量: 20很多初学者会在赋值时写成name zhangsan等号两边有空格这是错误的。Shell 会把name当作命令然后尝试执行结果就会报command not found。记住定义变量时等号两边绝对不能有空格。3.2 特殊变量脚本参数与执行状态运维脚本经常需要接收外部传入的参数。比如你写了一个部署脚本可能需要传入“环境名”和“版本号”。Shell 提供了几个固定格式的特殊变量特殊变量含义$0当前脚本的文件名$1、$2…传给脚本的第 1 个、第 2 个…参数$#参数的个数$所有参数列表$*所有参数字符串形式$?上一条命令执行后的返回状态0 表示成功非 0 表示失败来看一个实际例子#!/bin/bash # 文件路径~/shell-practice/params.sh echo 脚本名称: $0 echo 第一个参数: $1 echo 第二个参数: $2 echo 参数个数: $# echo 所有参数: $保存后执行bash params.sh dev v1.2.0输出结果脚本名称: params.sh 第一个参数: dev 第二个参数: v1.2.0 参数个数: 2 所有参数: dev v1.2.0在脚本中$?经常用于判断上一步操作是否成功。比如#!/bin/bash ls /tmp/not_exist_dir echo 上一条命令执行结果: $?因为/tmp/not_exist_dir不存在ls会报错$?返回非 0 值。掌握了这个变量你就可以实现“如果上一步失败则停止脚本”的逻辑。3.3 条件判断让脚本拥有逻辑3.3.1 if 语句Shell 的if语句基本语法如下if [ 条件 ]; then # 条件成立时执行的代码 else # 条件不成立时执行的代码 fi注意[ ]两边必须各有一个空格fi是if的反写用来结束整个条件块。下面是一个非常常见的判断文件是否存在例子#!/bin/bash # 文件路径~/shell-practice/if_demo.sh file/etc/passwd if [ -f $file ]; then echo 文件 ${file} 存在 else echo 文件 ${file} 不存在 fi3.3.2 常用文件判断参数在运维脚本中下面几个文件判断参数非常常用参数含义-f 文件判断是否为普通文件且存在-d 目录判断是否为目录且存在-e 路径判断路径是否存在文件或目录均可-r 文件、-w 文件、-x 文件判断文件是否有读、写、执行权限-s 文件判断文件是否存在且非空3.3.3 数值与字符串比较数值比较和字符串比较的写法不同这是新手经常搞混的地方#!/bin/bash # 文件路径~/shell-practice/compare.sh num88 # 数值比较-eq 等于-ne 不等于-gt 大于-lt 小于-ge 大于等于-le 小于等于 if [ $num -ge 60 ]; then echo 成绩 ${num} 分及格了 else echo 成绩 ${num} 分不及格 fi str1hello str2world # 字符串比较 等于! 不等于-z 为空-n 非空 if [ $str1 $str2 ]; then echo 两个字符串相等 else echo 两个字符串不相等 fi # 判断字符串是否为空 if [ -z $str3 ]; then echo 变量 str3 为空 fi运行结果成绩 88 分及格了 两个字符串不相等 变量 str3 为空一个最常见的坑是数值比较用、而不是-gt、-lt。如果你直接写[ $num 60 ]Shell 会把它当作重定向符号来处理导致逻辑完全错误而且不会有报错提示排查起来非常隐蔽。3.4 循环批量处理的神器循环是 Shell 脚本自动化能力的核心也是 Linux 运维面试的高频考点。最常用的是for循环和while循环。3.4.1 for 循环遍历列表#!/bin/bash # 文件路径~/shell-practice/for_demo.sh # 遍历静态列表 for ip in 192.168.1.10 192.168.1.11 192.168.1.12; do echo 正在检查服务器: ${ip} done echo -------------------- # 遍历 1 到 5 for num in {1..5}; do echo 当前数字: ${num} done echo -------------------- # 遍历某个目录下的所有 .log 文件 for file in /var/log/*.log; do echo 找到日志文件: ${file} done运行结果正在检查服务器: 192.168.1.10 正在检查服务器: 192.168.1.11 正在检查服务器: 192.168.1.12 -------------------- 当前数字: 1 当前数字: 2 当前数字: 3 当前数字: 4 当前数字: 5 -------------------- 找到日志文件: /var/log/...取决于你系统里实际的日志文件3.4.2 for 循环指定步长如果你需要遍历奇数或者每 10 个遍历一次可以使用类似 C 语言的写法#!/bin/bash # 文件路径~/shell-practice/for_step.sh for ((i 0; i 30; i 10)); do echo 步长为 10当前值: ${i} done3.4.3 while 循环while循环适合“不知道循环次数但知道结束条件”的场景。下面这个例子用于读取文件内容一行一行处理#!/bin/bash # 文件路径~/shell-practice/read_file.sh # 先准备一个示例文件 cat ip_list.txt EOF 192.168.1.10 192.168.1.11 192.168.1.12 EOF # 逐行读取 ip_list.txt 中的内容 while read -r ip; do echo 正在 ping 服务器: ${ip} ping -c 1 -W 2 ${ip} /dev/null 21 if [ $? -eq 0 ]; then echo ${ip} 网络可达 else echo ${ip} 网络不可达 fi done ip_list.txt注意最后一行done ip_list.txt它的作用是把文件内容重定向到while循环中作为输入。这是运维脚本中读取服务器列表、批量执行任务的标准写法。3.5 函数复用代码块当脚本变长以后如果把所有逻辑都堆在主线代码里阅读和维护会非常困难。函数可以把一段独立的功能封装起来需要时再调用。#!/bin/bash # 文件路径~/shell-practice/function_demo.sh # 定义一个函数 check_memory() { total$(free -m | awk /^Mem:/ {print $2}) used$(free -m | awk /^Mem:/ {print $3}) echo 总内存: ${total} MB已使用: ${used} MB } # 调用函数 check_memory函数定义时需要注意函数内部的变量默认是全局变量。如果你希望变量只作用于函数内部可以使用local声明#!/bin/bash # 文件路径~/shell-practice/local_var.sh my_func() { local local_var只在函数内有效 global_var全局变量 echo 函数内部: ${local_var} } my_func # 下面这行会输出空值因为 local_var 在函数外部不可见 echo 函数外部: ${local_var} # 下面这行可以正常输出 echo 函数外部: ${global_var}函数还可以接收参数在函数内部使用$1、$2等变量#!/bin/bash # 文件路径~/shell-practice/function_params.sh deploy_app() { local app_name$1 local version$2 echo 开始部署应用 ${app_name}版本号为 ${version} } deploy_app order-service v2.3.13.6 通配符与正则表达式的区别Shell 脚本里经常出现不知道用*、?、还是.*的情况。这里简单区分一下*和?是 Shell 的通配符用在文件名匹配中。*.log匹配所有以.log结尾的文件。.*、[0-9]等是正则表达式的写法主要用在grep、sed、awk中。举例#!/bin/bash # 通配符匹配当前目录下所有 .conf 文件 for conf in /etc/*.conf; do echo 配置文件: ${conf} done # 正则表达式从日志中提取以 ERROR 开头的行 grep ^ERROR /var/log/app.log两者的底层机制完全不同初学者先记住通配符用于命令行的文件路径匹配正则表达式用于文本内容匹配。4. 完整实战编写一个服务器巡检脚本前面我们学习了变量、条件判断、循环和函数现在把这些知识点串起来完成一个运维场景下的综合性脚本。这个脚本可以作为你日常巡检服务器的参考模板。4.1 需求分析假设你有几台 Linux 服务器每天需要检查以下内容系统负载情况load average。内存使用率是否超过阈值。磁盘使用率是否超过阈值。关键进程如 nginx、mysql是否在运行。将检查结果输出到日志文件。4.2 脚本完整代码下面的脚本使用了上一节提到的df、free、uptime等命令并通过条件判断和循环输出结果#!/bin/bash # 文件路径~/shell-practice/system_check.sh # 用途一键巡检系统负载、内存、磁盘和关键进程状态 # 使用方式bash system_check.sh # 定义颜色变量让输出更易读 RED\033[31m GREEN\033[32m YELLOW\033[33m RESET\033[0m # 配置参数 MEMORY_THRESHOLD80 # 内存使用率告警阈值单位百分比 DISK_THRESHOLD80 # 磁盘使用率告警阈值单位百分比 CHECK_PROCESSES(nginx mysqld) # 需要检查的关键进程列表 LOG_FILE/tmp/system_check.log # 日志输出路径 # 输出带时间的信息 log_info() { local msg$1 echo [$(date %Y-%m-%d %H:%M:%S)] ${msg} | tee -a ${LOG_FILE} } # 检查系统负载 check_load() { local load1 load5 load15 read -r load1 load5 load15 /proc/loadavg log_info 系统负载 (1/5/15分钟): ${load1} / ${load5} / ${load15} # 这里通过比较负载值前整数部分简单判断负载是否高于 4 local load_int load_int$(echo ${load1} | cut -d . -f 1) if [ ${load_int} -gt 4 ]; then echo -e ${RED}[告警] 系统负载偏高${RESET} | tee -a ${LOG_FILE} else echo -e ${GREEN}[正常] 系统负载正常${RESET} | tee -a ${LOG_FILE} fi } # 检查内存使用率 check_memory() { local total used available usage total$(free -m | awk /^Mem:/ {print $2}) used$(free -m | awk /^Mem:/ {print $3}) available$(free -m | awk /^Mem:/ {print $7}) if [ ${total} -eq 0 ]; then log_info 无法获取内存信息 return fi usage$((100 * (total - available) / total)) log_info 内存总量: ${total} MB已使用: ${used} MB可用: ${available} MB使用率: ${usage}% if [ ${usage} -ge ${MEMORY_THRESHOLD} ]; then echo -e ${RED}[告警] 内存使用率超过阈值 ${MEMORY_THRESHOLD}%${RESET} | tee -a ${LOG_FILE} else echo -e ${GREEN}[正常] 内存使用率未超阈值${RESET} | tee -a ${LOG_FILE} fi } # 检查磁盘使用率 check_disk() { # 提取根分区的使用率去掉百分号 local usage usage$(df -h / | awk NR2 {print $5} | tr -d %) log_info 根分区磁盘使用率: ${usage}% if [ ${usage} -ge ${DISK_THRESHOLD} ]; then echo -e ${RED}[告警] 磁盘使用率超过阈值 ${DISK_THRESHOLD}%${RESET} | tee -a ${LOG_FILE} else echo -e ${GREEN}[正常] 磁盘空间充足${RESET} | tee -a ${LOG_FILE} fi } # 检查关键进程 check_process() { local proc_name$1 if pgrep -x ${proc_name} /dev/null 21; then echo -e ${GREEN}[正常] 进程 ${proc_name} 正在运行${RESET} | tee -a ${LOG_FILE} else echo -e ${RED}[告警] 进程 ${proc_name} 未运行${RESET} | tee -a ${LOG_FILE} fi } # 主函数 main() { log_info 开始系统巡检 check_load check_memory check_disk for proc in ${CHECK_PROCESSES[]}; do check_process ${proc} done log_info 系统巡检结束 } # 执行主函数 main4.3 脚本关键点解释上面的脚本较长但是它的结构非常清晰我们拆开来看。第一个关键点是配置参数区。脚本开头用大写字母集中定义了内存阈值、磁盘阈值、进程列表和日志路径。这遵循了“配置与逻辑分离”的工程习惯。以后需要调整阈值时不用翻整个脚本直接修改顶部配置即可。第二个关键点是封装函数。check_load、check_memory、check_disk、check_process各自只负责一项检查互不干扰。如果以后想增加检查 CPU 温度、检查网络延迟等新功能只需要新增一个函数再在main函数里调用即可。第三个关键点是tee -a ${LOG_FILE}的用法。tee的作用是同时把内容输出到屏幕和文件-a表示追加写入而不是覆盖。这样既能在终端实时看到巡检过程也能把结果永久保留到日志里。第四个关键点是pgrep -x。pgrep按进程名查找进程 PID-x表示精确匹配进程名避免出现查找 nginx 时把 nginx 的 master 主进程和 worker 工作进程混在一起的情况。4.4 运行与验证给脚本添加执行权限并运行chmod x ~/shell-practice/system_check.sh bash ~/shell-practice/system_check.sh预期输出效果根据你服务器的实际状态略有不同[2025-01-20 10:30:01] 开始系统巡检 [2025-01-20 10:30:01] 系统负载 (1/5/15分钟): 0.15 / 0.21 / 0.19 [正常] 系统负载正常 [2025-01-20 10:30:01] 内存总量: 3822 MB已使用: 2105 MB可用: 1234 MB使用率: 67% [正常] 内存使用率未超阈值 [2025-01-20 10:30:01] 根分区磁盘使用率: 45% [正常] 磁盘空间充足 [正常] 进程 nginx 正在运行 [正常] 进程 mysqld 正在运行 [2025-01-20 10:30:01] 系统巡检结束 如果你没有安装 nginx 或 mysqld对应行会输出“进程未运行”的告警这属于正常现象。测试完成后可以把CHECK_PROCESSES改成你服务器上实际存在的进程或者删掉这个数组并注释掉对应循环。4.5 接入 crontab 定时任务手动执行脚本只能巡检一次。真实运维场景中更常见的是每天定时自动巡检。crontab 是 Linux 内置的定时任务工具可以用它来定期运行脚本。输入下面命令打开当前用户的定时任务编辑界面crontab -e如果是第一次使用系统会提示选择编辑器一般选择 vim 或 nano 即可。然后添加一行0 8 * * * /bin/bash /root/shell-practice/system_check.sh这行配置的含义是每天 8 点整执行一次系统巡检脚本。五个时间字段从左到右分别是“分钟、小时、日期、月份、星期”*表示任意值。更具体地说0 8 * * *每天 8 点 0 分执行。*/10 * * * *每 10 分钟执行一次。0 2 * * 1每周一凌晨 2 点执行。配置完之后可查看已添加的定时任务crontab -l提示脚本路径建议写绝对路径否则 crontab 在最小化环境中执行时可能因为环境变量不同而找不到命令。如果脚本中使用了自定义命令也可以在 crontab 中写命令的完整路径例如/usr/bin/free。5. 常见问题与排查思路5.1 提示“bad interpreter”或执行报错问题现象常见原因解决思路执行./xxx.sh报错bad interpreter: No such file or directory脚本文件是 Windows 编码包含 CRLF 换行符使用sed -i s/\r$// xxx.sh去除回车符执行脚本报Permission denied没有执行权限执行chmod x xxx.sh脚本内容有中文输出乱码文件编码不是 UTF-8在 vim 中执行:set fileencodingutf-8后保存5.2 变量比较报错“integer expression expected”这个问题非常常见。当你使用[ $num -ge 60 ]这样的写法时如果num的值不是纯数字比如为空字符串或包含字母就会报错[: : integer expression expected解决方法是在比较前先确认变量是数字或者给变量一个默认值。例如num${num:-0} if [ ${num} -ge 60 ]; then echo 及格 fi${num:-0}表示如果num未设置或为空则使用0作为默认值。5.3 脚本中无法找到命令有些命令在终端里可以直接执行但放到脚本里却提示command not found。这是因为终端登录时会加载用户的环境变量比如PATH而脚本执行时继承的环境信息可能不完整。排查方式# 在脚本开头输出 PATH 环境变量 echo ${PATH} # 查看某个命令的真实路径比如 java which java解决办法是在脚本开头显式声明变量路径#!/bin/bash export PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin5.4 if 语句里的空格问题新手经常把if写成下面两种错误形式错误形式一if [$num -gt 10]缺少空格。错误形式二if [ $num -gt 10 ] ; then脚本变成单行时缺少分号。Shell 对语法的空白要求非常严格。正确写法是if [ ${num} -gt 10 ]; then ... fi5.5 脚本重复执行导致幂等性问题比如你写了一个“创建用户”的脚本第一次执行没问题第二次执行却因为用户已存在而报错。解决思路是在执行前先加判断#!/bin/bash usernamedeploy if id ${username} /dev/null 21; then echo 用户 ${username} 已存在跳过创建 else useradd ${username} echo 用户 ${username} 创建成功 fi在实际运维脚本中这种“先检查再执行”的思路能显著提高脚本的稳定性。6. 生产环境中的 Shell 脚本最佳实践6.1 脚本开头规范每一个正式脚本都应该包含以下信息#!/bin/bash # 文件名backup_log.sh # 用途清理并备份 7 天前的日志文件 # 作者你的名字 # 修改记录 # 2025-01-20 创建初始版本 # 2025-01-21 添加压缩功能 set -e其中set -e是一个非常实用的参数它表示“当脚本中任意一条命令执行失败时立即退出脚本”。这可以避免失败后继续执行后续命令产生连锁错误。但使用set -e时也要小心某些命令即使执行失败你也希望脚本继续。这时可以在命令末尾加|| true例如set -e rm -f /tmp/cache_file || true6.2 变量使用规范命名方面建议遵循下面几条约定全局配置用全大写比如BACKUP_DIR。函数内临时变量用local声明避免污染全局。变量使用统一加花括号例如${BACKUP_DIR}提高可读性。变量赋值时值如果包含空格一定要加引号nameZhang San。另外要养成“重要命令执行前提示用户”的习惯#!/bin/bash # 危险操作确认 read -p 即将清空目录 ${BACKUP_DIR}是否继续(yes/no): confirm if [ ${confirm} ! yes ]; then echo 已取消操作 exit 1 fi6.3 日志记录与错误处理生产环境中的脚本必须留下日志。最简单的方式是使用系统自带的logger或tee。如果不想每次都写tee -a可以这样封装#!/bin/bash LOG_FILE/var/log/my_script.log log() { echo [$(date %Y-%m-%d %H:%M:%S)] $* | tee -a ${LOG_FILE} } log 开始部署服务对于关键命令建议把标准输出和标准错误分别处理tar -czf backup.tar.gz /data 2 ${LOG_FILE}上面这条命令中2表示把错误信息追加写入日志文件而不会打断终端输出。6.4 安全边界与权限规范脚本如果涉及敏感信息数据库密码、API Key不要硬编码在脚本中建议使用配置文件或环境变量。创建脚本文件后权限不要随便给到777。通常755自己可读写执行其他人可读可执行就足够了。如果需要用root权限执行脚本请先仔细检查脚本内容避免误操作影响整个系统。凡是涉及rm -rf、dd、mkfs等危险命令必须在脚本中增加二次确认逻辑并在测试环境验证无误后再上线。6.5 脚本调试技巧调试 Shell 脚本最常用的是bash -x它能逐行显示命令的执行过程bash -x system_check.sh执行后你会看到类似下面的输出 [ 0.15 -gt 4 ] echo -e \033[32m[正常] 系统负载正常\033[0m只要看到开头的内容就是实际执行的命令和变量展开后的结果。如果脚本逻辑没按预期走用bash -x排查通常能很快找到原因。另外也可以用bash -n只做语法检查不执行脚本bash -n system_check.sh如果脚本存在语法错误会直接提示没有提示则说明语法没问题。6.6 脚本的性能与可维护性运维脚本虽然不像应用程序那样追求极致性能但在处理大量数据时仍需注意。比如批量处理一千万行日志时避免在循环中使用cat和grep反复读取文件。推荐的做法是先用grep或awk一次性筛选出需要的数据再进入循环处理。可维护性方面尽量做到一个脚本只做一件事。如果你发现自己写的脚本已经超过 300 行且功能混杂建议拆分成多个脚本文件或封装成函数库。7. 总结与下一步学习建议通过这篇文章你已经走完了 Linux 运维入门最关键的一步从理解 Shell 脚本的概念到掌握变量、条件判断、循环、函数这些核心语法再通过一个完整的服务器巡检脚本把知识串联起来最后学会了如何用 crontab 让脚本定时自动运行。接下来你可以沿着下面几个方向继续深入文本处理三剑客grep、sed、awk是 Linux 运维中使用频率极高的工具Shell 脚本配合它们才能发挥最大威力。Linux 常用命令体系find、scp、tar、systemctl等命令的深入用法建议边用边查边总结。编写完整的上线部署脚本尝试把一个 Java 项目从拉取代码、编译打包、停服备份、启动服务到健康检查全流程写成脚本这是很多运维岗位的实际面试题。学习其他自动化工具当你的服务器数量增长到几十台、上百台时Shell 脚本管理起来会越来越吃力此时可以了解 Ansible 这类批量运维工具但前提仍然是先把 Shell 基础打好。最后给你一个可以立刻动手的小任务把上面那个系统巡检脚本拷贝到你的服务器上修改阈值和进程列表再手动执行一次。不要复制之后就收藏吃灰动手敲一遍遇到报错就按第 6 节的调试方法排查这个过程积累出来的问题处理经验才是面试和工作中真正值钱的部分。如果你在练习中遇到任何困惑欢迎在评论区留言讨论。
返回列表