从零编写你的第一个 Bash 脚本:服务器状态检查实战指南(introduction-to-bash-scripting)
2026/9/17 3:22:29 网站建设 项目流程

从零编写你的第一个 Bash 脚本:服务器状态检查实战指南(introduction-to-bash-scripting)

【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting

本篇实战指南以开源电子书《Introduction to Bash Scripting》中"Write your first Bash script"章节为核心,带你把前面学过的 Shebang、变量、注释、函数等基础知识点串起来,动手编写一个能够采集服务器磁盘、CPU、内存使用情况以及内核版本的status.sh脚本。读完本文,你将掌握 Bash 脚本从规划、编写、执行到调试的完整闭环,并能够基于示例自由增删功能,满足你自己的运维与自动化需求。

为什么用脚本汇总服务器状态

系统管理员和 DevOps 工程师的日常工作,往往包含大量重复的检查操作:登录服务器、敲几条命令看内存、看负载、看内核版本……每台机器都要手动重复一遍。而 Bash 脚本的核心价值,正如电子书《Introduction to Bash scripting》开篇所说:把多条 Linux 命令组合进一个文本文件,一次执行即可完成原本繁琐重复的日常任务

本文的示例脚本目标是采集以下四类信息:

  • 当前磁盘使用情况(Disk usage)
  • 当前 CPU 使用情况(CPU usage)
  • 当前内存(RAM)使用情况
  • 精确的内核版本号(Kernel version)

你可以随意增删功能模块,让它匹配自己的实际场景。

第一步:规划脚本

动手写代码之前,先想清楚脚本要回答什么问题。本章节的示例脚本status.sh,本质是一台服务器的"体检报告"生成器。规划阶段只需要明确两件事:

  1. 采集哪些指标:磁盘、CPU、内存、内核版本(还可以扩展为 TCP 连接数等);
  2. 用什么命令采集free -h看内存、uptime看负载、uname -r看内核、df -h看磁盘。

规划越清晰,写出来的脚本越容易维护。接下来进入编码阶段。

第二步:创建脚本文件与 Shebang

创建一个以.sh结尾的新文件,例如:

touch status.sh

也可以直接用编辑器创建,如:

nano status.sh

正如电子书 Bash Structure 章节所讲,脚本文件的第一行必须是指向 Bash 解释器的绝对路径,即 Shebang:

#!/bin/bash

Shebang 的作用是告诉操作系统:用/bin/bash这个可执行程序来运行本脚本。需要注意,Bash 并不总是位于/bin/bash(在非 Linux 系统或作为可选包安装时可能不同),此时可以改用更通用的写法:

#!/usr/bin/env bash

这种写法会从PATH环境变量列出的目录中查找 bash 可执行文件,兼容性更好。本示例统一使用#!/bin/bash

第三步:用注释说明脚本用途

正如 Bash Comments 章节强调的,注释是给自己和他人留下的阅读线索,以#开头,不会被渲染执行。在 Shebang 之后紧跟着加上用途说明:

#!/bin/bash # Script that returns the current server status

清晰的注释能让其他人在几分钟内理解脚本是干什么的,这也是开源项目协作的基本素养。

第四步:添加第一个变量

接着应用 Bash Variables 章节的知识。Bash 中给变量赋值用=号,且等号两边不能有空格。示例中把服务器主机名存进变量,方便后续在多个函数中复用:

server_name=$(hostname)

这里的$()是关键:它告诉 Bash 先执行括号内的命令(hostname),再把命令的输出去赋值给变量,这叫做"命令替换"(command substitution)。验证一下:

echo "$server_name"

就会输出当前主机名。同时注意两条重要习惯:

  • 变量引用务必加双引号"$server_name"而不是$server_name。不加引号时,Bash 会对变量值执行分词(word splitting)和通配符展开(globbing),一旦值里含空格或*?等特殊字符,脚本就会出 bug 甚至产生安全隐患。唯一的常见例外是[[ ]]测试括号内部。
  • 必要时使用花括号${server_name}在变量名后面紧跟其他字符时是必须的,例如echo "${greeting}s world";数组下标${array[0]}、字符串切片、默认值等场景同样需要花括号。

第五步:编写第一个函数

函数是复用代码的利器。参考 Bash Functions 章节,Bash 函数的标准结构如下:

function function_name() { your_commands }

其中function关键字可以省略(function_name() { ... }同样合法),写不写属于个人风格偏好。下面创建一个返回服务器内存使用情况的函数:

function memory_check() { echo "" echo "The current memory usage on ${server_name} is: " free -h echo "" }

逐行拆解:

  • function memory_check() {:定义函数memory_check
  • echo "":打印一个空行,让输出更易读;
  • echo "The current memory usage on ${server_name} is: ":打印提示信息并引用$server_name变量;
  • free -h:以人类可读格式显示内存用量(-h表示 human-readable);
  • }:闭合函数体。

定义好之后,直接写函数名即可调用,注意调用时不要加括号

# Define the function function memory_check() { echo "" echo "The current memory usage on ${server_name} is: " free -h echo "" } # Call the function memory_check

第六步:挑战——自己补全其余函数

在查看完整答案之前,建议先自己动手,参照memory_check的写法补全以下四个功能函数:

  • 当前磁盘使用情况(Disk usage)
  • 当前 CPU 使用情况(CPU usage)
  • 当前内存(RAM)使用情况
  • 精确的内核版本号(Kernel version)

如果记不清该用哪些命令,可以借助搜索引擎查阅。完成后与下面的示例对比——请注意,实现方式不止一种,只要逻辑正确都是好答案

完整示例脚本:status.sh

下面是本章节的最终成品,它在前文基础上增加了一个all_checks聚合函数,一次调用即可顺序执行全部检查:

#!/bin/bash ## # BASH script that checks: # - Memory usage # - CPU load # - Number of TCP connections # - Kernel version ## server_name=$(hostname) function memory_check() { echo "" echo "Memory usage on ${server_name} is: " free -h echo "" } function cpu_check() { echo "" echo "CPU load on ${server_name} is: " echo "" uptime echo "" } function tcp_check() { echo "" echo "TCP connections on ${server_name}: " echo "" wc -l < /proc/net/tcp echo "" } function kernel_check() { echo "" echo "Kernel version on ${server_name} is: " echo "" uname -r echo "" } function all_checks() { memory_check cpu_check tcp_check kernel_check } all_checks

对新增部分的说明:

  • cpu_check:使用uptime命令输出系统负载均值(load average)与运行时长,是评估 CPU 负载最直接的手段;
  • tcp_check:通过wc -l < /proc/net/tcp统计/proc/net/tcp的行数,即当前 TCP 连接数量(/proc伪文件系统是 Linux 内核状态的实时窗口);
  • kernel_check:使用uname -r输出精确的内核版本号,例如5.15.0-91-generic
  • all_checks:按顺序调用上述四个函数,然后在脚本末尾调用一次all_checks,实现一键体检。

如何执行与调试脚本

执行方式

参考 Bash Hello World 章节,有两种常见执行方式:

bash status.sh

或先赋予执行权限再直接运行:

chmod +x status.sh ./status.sh

调试技巧

参考 Debugging, testing and shortcuts 章节:

  • 使用-x跟踪执行过程,逐行打印所有被执行到的命令:
bash -x ./status.sh
  • 也可以在脚本中需要调试的位置前加set -x,它会打开 shell 的跟踪模式,把后续每条命令都打印到终端,定位逻辑问题时非常高效。

静态检查

本仓库还提供了一个非常实用的质量保障脚本:scripts/shellcheck-ebook.sh。它会自动提取英文电子书所有 markdown 文件中的 bash 代码块,逐一交给shellcheck做静态检查,并排除了 SC2034(变量看似未使用)、SC2154(引用了未赋值的变量)、SC2145 等在"教学片段"语境下合理的告警码:

./scripts/shellcheck-ebook.sh [ebook_dir]

你可以用同样的思路,把自己写的status.sh交给shellcheck -S warning检查,提前发现未加引号的变量、潜在的分词问题等隐患。整个检查脚本以set -euo pipefail开启严格模式,全部代码块通过时返回退出码 0,否则返回 1 并输出告警详情——这正是工程化 Bash 脚本应当具备的严谨性。

小结与延伸

至此,你已经独立完成了一个真实可用的 Bash 脚本:从 Shebang、注释、命令替换变量,到函数封装与聚合调用,再到执行、调试与静态检查,覆盖了 Bash 脚本开发的完整工作流。正如章节结语所说,无论你是 DevOps/SysOps 工程师、开发者,还是 Linux 爱好者,都可以用 Bash 脚本把零散的 Linux 命令组合起来,自动化那些无聊且重复的日常任务。

如果你想让脚本更加完善,还可以沿着本仓库后续章节继续深入:参考 Creating custom bash commands 把常用检查做成 alias,或者参考 Creating an interactive menu in Bash 为脚本加上交互菜单。把今天写的函数与变量知识,应用到更多真实场景中去吧。

【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询