)
从零编写你的第一个 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_checkecho 打印一个空行让输出更易读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-genericall_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),仅供参考