从零编写你的第一个 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,本质是一台服务器的"体检报告"生成器。规划阶段只需要明确两件事:
- 采集哪些指标:磁盘、CPU、内存、内核版本(还可以扩展为 TCP 连接数等);
- 用什么命令采集:
free -h看内存、uptime看负载、uname -r看内核、df -h看磁盘。
规划越清晰,写出来的脚本越容易维护。接下来进入编码阶段。
第二步:创建脚本文件与 Shebang
创建一个以.sh结尾的新文件,例如:
touch status.sh也可以直接用编辑器创建,如:
nano status.sh正如电子书 Bash Structure 章节所讲,脚本文件的第一行必须是指向 Bash 解释器的绝对路径,即 Shebang:
#!/bin/bashShebang 的作用是告诉操作系统:用/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),仅供参考