)
编写你的第一个 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》中编写你的第一个 Bash 脚本章节的完整实战讲解。我们将把前面学到的 shebang、注释、变量与函数知识整合起来从零编写一个名为status.sh的服务器状态检查脚本——它会一次性输出当前服务器的内存使用、CPU 负载、TCP 连接数与内核版本。读完本文你将掌握 Bash 脚本从规划、编写、执行到调试的完整流程并能直接复制该脚本用于自己的服务器巡检。一、先规划再动手脚本要解决什么问题在写任何脚本之前先明确目标。本节要实现的脚本会收集服务器上的四类有用信息当前磁盘使用情况Disk usage当前 CPU 使用情况CPU load当前内存RAM使用情况精确的内核Kernel版本号脚本的价值在于这些信息平时需要一条条手动执行命令去查而写成脚本后一次运行即可全部输出。你可以根据自己的需求自由增删功能让它匹配你的实际运维场景。这正是 Bash 脚本的核心用途——把零散的 Linux 命令组合起来自动化那些枯燥、重复的日常任务参考 README.md 中对本书定位的描述帮助 SysOps、DevOps 与开发者用脚本自动化日常任务。二、创建脚本文件与 Shebang2.1 创建.sh文件第一步是创建一个以.sh为扩展名的新文件。我们将其命名为status.sh因为它输出的正是服务器的状态touch status.sh也可以直接用你喜欢的文本编辑器创建并打开例如 nano 或 vimnano status.sh2.2 第一行必须是 Shebang正如本书第 1 章Bash 结构与第 3 章Bash Hello World所强调的脚本文件的第一行必须指定 bash 解释器的绝对路径#!/bin/bash这行被称为 Shebang。它的全部作用就是告诉操作系统请用/bin/bash这个可执行程序来运行本脚本。需要特别说明的是bash 并不总在/bin/bash目录下——尤其在非 Linux 系统上或 bash 是作为可选包安装的情况下。此时可以改用#!/usr/bin/env bash这种写法会在PATH环境变量列出的目录中查找 bash 可执行文件兼容性更好。对于本教程的 Linux 服务器场景#!/bin/bash完全够用。2.3 运行脚本的两种方式写完脚本后可以先用chmod x赋予执行权限再直接执行来自 003-bash-hello-world.mdchmod x status.sh ./status.sh或者不修改权限直接用 bash 解释器运行bash status.sh三、添加注释让脚本可读正如本书第 6 章Bash 注释所讲以#开头的行是注释永远不会渲染到屏幕上。注释是给读代码的人看的——无论是未来的你还是协作者都能借助注释快速理解脚本用途。在 shebang 之后加上一句脚本用途说明#!/bin/bash # Script that returns the current server status养成给复杂逻辑写注释的习惯是编写高质量 Bash 脚本的重要一环。事实上本书第 12 章Bash 函数甚至建议在函数头部用注释块说明描述、全局变量、参数、输出与返回值让函数像接口文档一样清晰。四、添加第一个变量捕获主机名现在应用第 4 章Bash 变量的知识添加脚本中会用到的变量。Bash 中给变量赋值只需用号。我们把服务器的主机名存入一个变量供后续所有函数复用server_name$(hostname)这里的$()是关键它告诉 bash 先执行括号内的命令hostname再把命令的输出结果赋给变量。这种写法叫命令替换command substitution。验证一下变量是否生效echo $server_name执行后会输出当前主机名。引用规范提醒本书第 4 章特别强调变量引用应始终用双引号包裹$server_name避免词分割word splitting与通配符展开globbing带来的 bug 甚至安全隐患当变量名后紧跟会被误认为变量名一部分的字符时还必须使用花括号${server_name}。本章后续函数中使用的正是${server_name}这种带花括号的写法用于在字符串中清晰地隔离变量名。五、添加第一个函数内存检查应用第 12 章Bash 函数的知识。Bash 函数的定义结构为function function_name() { your_commands }也可以省略开头的function关键字写成function_name() { ... }两种写法都有效是否保留function关键字属于个人偏好问题。下面创建一个返回当前内存使用情况的函数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—— 以人类可读格式KB/MB/GB显示内存使用情况这是 Linux 系统自带的核心命令}—— 函数结束。函数定义之后调用它只需写出函数名注意调用时不要加括号这是本书第 12 章明确提醒的易错点# 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 load当前内存RAM使用情况即上面已完成的部分精确的内核版本号Kernel version如果拿不准该用哪些命令可以查阅系统手册man或自行搜索。写完后再对照下一节的示例脚本比较结果。需要记住的是实现方式不止一种只要能正确输出信息都是好答案。提示磁盘使用常用df -hCPU 负载常用uptime内核版本常用uname -rTCP 连接数可以读取/proc/net/tcp。七、示例脚本完整的 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_checks7.1 脚本结构拆解这个脚本集中体现了前面章节的全部核心知识点结构对应代码作用Shebang#!/bin/bash指定 bash 解释器第 2 章块注释## ... ##说明脚本检查的项目第 6 章变量 命令替换server_name$(hostname)捕获主机名供全脚本复用第 4 章函数定义function xxx() { ... }每个检查项封装为一个函数第 12 章函数调用memory_check/all_checks定义后用函数名直接调用调用时不加括号输出命令echo、free -h、uptime、uname -r、wc -l组合标准 Linux 命令完成信息采集7.2 各检查函数的实现要点内存检查free -h输出总内存、已用、空闲与交换分区的容量-h参数让数值以易读的单位显示。CPU 负载检查uptime除了显示系统运行时间、当前登录用户数还会给出 1、5、15 分钟的平均负载是判断 CPU 压力的快速手段。TCP 连接数检查wc -l /proc/net/tcp统计/proc/net/tcp文件的行数。这里用输入重定向把文件内容喂给wc -l进行行计数得到的行数即当前 TCP 连接条目数一个轻量级的连接数估算方法。关于重定向的更多细节可参考本书第 23 章 Bash 重定向。内核版本检查uname -r精确输出当前运行的内核版本号如5.15.0-91-generic。聚合执行all_checks函数按顺序调用上述四个函数脚本末尾只需一行all_checks即可完成全部检查。这种每个功能一个函数 一个总调度函数的组织方式正是把脚本模块化的经典模式。八、运行、调试与质量保障8.1 执行脚本chmod x status.sh ./status.sh或bash status.sh8.2 用bash -x调试脚本运行结果不符合预期时可以用跟踪模式调试参考第 13 章 调试与测试bash -x ./status.sh-x会让 bash 把每一条即将执行的命令展开变量之后都打印到终端方便你逐行追踪脚本执行过程。也可以只在需要调试的代码段前加set -x用set x关闭。8.3 用 ShellCheck 做静态检查本书推荐使用 ShellCheck 对脚本做静态分析。除了在线版也可以在本仓库直接验证仓库提供了 scripts/shellcheck-ebook.sh 脚本它会自动从电子书的 Markdown 文件中提取所有 bash 代码块并对每个代码块运行shellcheck -S warning检查。这个仓库脚本的若干细节正好印证了本章代码块的质量标准它默认扫描ebook/en/content目录下的全部 Markdown 文件可通过第一个参数指定其他目录把每个 bash 代码块抽取成临时.sh文件后逐一检查对典型的教学代码片段它排除了诸如 SC2034变量看似未使用、SC2154引用了未赋值的变量等噪音告警因为片段中的变量会在后续代码块中才使用对刻意演示错误的代码块位于 Incorrect 或 Error 标题之后以及含占位符的片段则直接跳过不计入检查。这说明本文中的脚本示例不仅语法正确而且经得起 ShellCheck 这类专业工具的静态检查。你也可以用同样的方式验证自己写的脚本shellcheck status.sh九、总结无论你是 DevOps/SysOps 工程师、开发者还是单纯的 Linux 爱好者都可以用 Bash 脚本把不同的 Linux 命令组合起来自动化那些枯燥重复的日常任务把精力放在更有产出、更有趣的事情上。本节的status.sh虽然只有不到 40 行却完整串联了 shebang、注释、命令替换、变量、函数定义与调用、输入重定向、以及聚合调度函数的模块化思想。以此为起点你可以继续阅读本书后续章节将它扩展为交互式菜单第 16 章 创建交互式菜单、批量远程执行第 17 章 在多台远程服务器上执行 Bash 脚本等更强大的自动化工具。完整电子书内容位于 ebook/en/content 目录并已提供 PDF/EPUB 导出成品见 ebook/en/export 目录例如 introduction-to-bash-scripting.epub 可直接阅读。【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考