新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于 Bash 脚本项目实战:构建一个交互式多选项菜单(系统状态检查器)

发布时间:2026/9/17 6:43:27来源:尧图网络
基于 Bash 脚本项目实战:构建一个交互式多选项菜单(系统状态检查器)
基于 Bash 脚本项目实战构建一个交互式多选项菜单系统状态检查器【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting本文内容严格依据仓库中 ebook/es/content/016-creating-an-interactive-menu-in-bash.md 的教程主体并结合仓库内英文原版章节、前序章节脚本及 scripts/shellcheck-ebook.sh 质量校验脚本进行补充与验证而成。导读在完成首个服务器状态检查脚本第 15 章之后下一步自然是让脚本具备人机交互能力用户输入一个数字脚本执行对应动作然后循环等待下一次选择直到用户主动退出。这正是本文的核心主题——用 Bash 的case分支语句 read读取输入构建一个带彩色提示的交互式多选项菜单。本篇指南将带领你完成规划菜单需要暴露的功能内存、CPU、TCP 连接数、内核版本四项系统检查复用并改造上一章的检查函数使用 ANSI 转义码为菜单添加绿/蓝/红色高亮用case ... esac结构编写菜单循环与默认错误分支完整运行测试并了解仓库自带的 shellcheck 代码质量校验工具。读完本文你将掌握 Bash 交互式菜单的标准范式并能把它套用到自己的运维、部署或工具类脚本中。一、功能规划让服务器状态检查脚本可选回顾上一章第 15 章编写你的第一个 Bash 脚本我们构建了一个一次性输出全部信息的status.sh。本文要在它基础上加入菜单让用户选择要执行哪一项检查检查当前磁盘/内存使用情况检查当前 CPU 负载检查当前内存RAM使用情况检查内核精确版本。如果你手头没有上一章的脚本这里就是完整的基准脚本对应英文原版 ebook/en/content/015-writing-your-first-bash-script.md 第 122-174 行的最终版本也是 第 17 章远程执行 直接复用的同款脚本#!/bin/bash ## # BASH 菜单脚本用于检查 # - 内存使用 # - CPU 负载 # - TCP 连接数 # - 内核版本 ## 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 }几个值得注意的细节server_name$(hostname)$()是命令替换Bash 会先执行括号内的hostname命令再把输出赋给变量之后所有函数都能引用${server_name}函数定义遵循 第 12 章《Bash 函数》 的规范function 函数名() { ... }调用时直接写函数名、不带括号tcp_check用wc -l /proc/net/tcp统计连接行数/proc/net/tcp是 Linux 内核导出的 TCP 连接表每一行代表一条连接行数减去表头即连接数。西班牙语版此处写作cat /proc/net/tcp | wc -l效果等价但wc -l 文件免去了管道和多余进程是更简洁的写法all_checks作为聚合函数依次调用四个子函数对应菜单里的 Check All / 全部检查 选项。注意free -h、uptime、uname -r均为 Linux 自带命令因此本脚本面向 Linux 环境macOS 上部分输出格式会略有差异。二、为菜单添加颜色ANSI 转义码与颜色函数纯文本菜单能看但不够直观。为了让用户一眼看清选项编号与提示语我们引入 ANSI 颜色转义码。Bash 脚本中颜色通常以\e[xxm等价于\033[xxm形式出现\e即 ESC 转义字符。在脚本开头添加如下颜色变量与颜色函数英文原版见 ebook/en/content/016-creating-an-interactive-menu-in-bash.md 第 80-99 行西班牙语版为verde/azul/clear三色英文版额外定义了red红色## # 颜色变量 ## green\e[32m blue\e[34m red\e[31m clear\e[0m ## # 颜色函数 ## ColorGreen(){ echo -ne ${green}${1}${clear} } ColorBlue(){ echo -ne ${blue}${1}${clear} }2.1 逐个解释元素含义\e[32m绿色前景色转义序列\e[34m蓝色前景色转义序列\e[31m红色前景色转义序列用于错误提示\e[0m重置所有颜色与样式防止颜色泄漏到后续输出ColorGreen(){ ... }与ColorBlue(){ ... }接收第一个参数$1即要上色的文本输出格式为颜色码 文本 重置码echo -ne中的-n表示不追加换行-e表示解析转义序列\e、\n等。这是\e[32m能生效的关键普通echo会把它当字面文本输出。2.2 颜色函数的使用方式echo -ne $(ColorBlue Some text here)上面这条命令会把Some text here以蓝色打印到终端。其原理是命令替换$(...)先把ColorBlue Some text here的输出即\e[34mSome text here\e[0m取回再交给echo -ne输出。这个模式在菜单函数中会被反复使用为每个选项编号染色。三、添加菜单函数case ... esac分支核心有了检查函数和颜色函数最后一步是编写menu()函数先打印菜单再读取用户输入最后用case语句根据输入分派到对应函数。menu(){ echo -ne My First Menu $(ColorGreen 1)) Memory usage $(ColorGreen 2)) CPU load $(ColorGreen 3)) Number of TCP connections $(ColorGreen 4)) Kernel version $(ColorGreen 5)) Check All $(ColorGreen 0)) Exit $(ColorBlue Choose an option:) read a case $a in 1) memory_check ; menu ;; 2) cpu_check ; menu ;; 3) tcp_check ; menu ;; 4) kernel_check ; menu ;; 5) all_checks ; menu ;; 0) exit 0 ;; *) echo -e ${red}Wrong option.${clear}; menu ;; esac }3.1 逐段拆解第一步打印带颜色的菜单选项echo -ne My First Menu $(ColorGreen 1)) Memory usage ... $(ColorBlue Choose an option:) 外层字符串使用双引号包裹因此内部的$(ColorGreen 1))命令替换会被执行把选项编号染成绿色选项文本保留为白色形成绿色编号 白色说明 蓝色提示的层次-n保证打印完提示后光标停留在同一行方便用户直接输入。第二步读取用户输入read aread是 Bash 内置命令读取一行标准输入并存入变量aread的用法详见 第 5 章《Bash 用户输入》。此处未加-p提示参数因为提示语已经由上一行echo打印。第三步case分支分派case $a in 1) memory_check ; menu ;; 2) cpu_check ; menu ;; ... 0) exit 0 ;; *) echo -e ${red}Wrong option.${clear}; menu ;; esac这正是 第 10 章《Bash 条件语句》 中case语法case $变量 in 模式) 命令 ;; ... esac的实战应用。逐条解读每个数字模式匹配后先执行对应检查函数再递归调用menu——这是让菜单回到开头、循环显示的关键设计memory_check ; menu中的分号是顺序执行分隔符先检查、后回菜单0) exit 0 ;;选择 0 时调用exit 0干净退出脚本*)是默认通配分支任何不匹配 0-5 的输入都会落入此处用红色打印Wrong option.后重新调用menu让用户重新选择。这等价于if-else链中的else是防止非法输入导致脚本崩溃的保险丝。关于原文的一处笔误西班牙语版在默认分支里写了WrongCommand一个未定义函数英文原版为menu。本文采用修正后的写法——在出错后重新调用menu返回菜单这才是该分支的预期行为。第四步调用菜单函数定义之后必须显式调用才会执行# 调用菜单函数 menumenu是脚本最后一行脚本一启动就进入菜单循环。四、完整脚本可直接运行的menu.sh将以上内容组合得到完整的交互式菜单脚本与英文原版 ebook/en/content/016-creating-an-interactive-menu-in-bash.md 第 184-278 行的完整版一致#!/bin/bash ## # BASH 菜单脚本用于检查 # - 内存使用 # - CPU 负载 # - TCP 连接数 # - 内核版本 ## 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 } ## # 颜色变量 ## green\e[32m blue\e[34m red\e[31m clear\e[0m ## # 颜色函数 ## ColorGreen(){ echo -ne ${green}${1}${clear} } ColorBlue(){ echo -ne ${blue}${1}${clear} } menu(){ echo -ne My First Menu $(ColorGreen 1)) Memory usage $(ColorGreen 2)) CPU load $(ColorGreen 3)) Number of TCP connections $(ColorGreen 4)) Kernel version $(ColorGreen 5)) Check All $(ColorGreen 0)) Exit $(ColorBlue Choose an option:) read a case $a in 1) memory_check ; menu ;; 2) cpu_check ; menu ;; 3) tcp_check ; menu ;; 4) kernel_check ; menu ;; 5) all_checks ; menu ;; 0) exit 0 ;; *) echo -e ${red}Wrong option.${clear}; menu ;; esac } # 调用菜单函数 menu4.1 运行与预期输出创建一个以.sh结尾的文件例如menu.sh将上述内容粘贴保存然后运行bash menu.sh预期输出如下颜色无法在文本中体现实际终端中编号为绿色、提示语为蓝色My First Menu 1) Memory usage 2) CPU load 3) Number of TCP connections 4) Kernel version 5) Check All 0) Exit Choose an option:此时终端等待你输入。选择不同数字会触发不同的函数输入1→ 执行memory_check输出free -h的内存统计输入2→ 执行cpu_check输出uptime的负载信息输入3→ 执行tcp_check输出/proc/net/tcp的行数输入4→ 执行kernel_check输出uname -r的内核版本输入5→ 执行all_checks依次跑完上面四项输入0→exit 0退出脚本输入其他任意内容 → 红色提示Wrong option.并重新显示菜单。每次检查完成后菜单都会再次出现形成选择 → 执行 → 返回菜单的循环直到你输入0。4.2 给脚本加执行权限可选虽然bash menu.sh无需可执行权限即可运行但若想直接以./menu.sh方式运行需要两步chmod x menu.sh ./menu.sh其中首行#!/bin/bashshebang详见 第 1 章《Bash 入门》 与 第 3 章《Hello World》会告诉系统用/bin/bash解释器执行本脚本。五、仓库自带的代码质量校验shellcheck 如何守护这类脚本这个开源电子书仓库不仅提供教程文字还自带一个质量保障脚本 scripts/shellcheck-ebook.sh。它会自动提取英文版 ebook/en/content 目录下所有 Markdown 文件中的bash代码块逐个交给 shellcheck 静态检查确保书中的每个脚本片段都可运行、无低级错误。./scripts/shellcheck-ebook.sh [ebook_dir] # ebook_dir 默认为 ebook/en/content几个与本文菜单脚本直接相关的实现细节scripts/shellcheck-ebook.sh 第 90-96 行若代码块第一行匹配^[0-9]\)例如菜单的示例输出1) Memory usage会被识别为select-menu 输出/菜单渲染结果判定为不可直接执行的展示文本而跳过检查若某个代码块所在标题行含 Incorrect、### Error、Output 等字样也会被跳过——说明仓库刻意收录了一些错误示范用于教学对比未跳过的真实脚本代码块则使用shellcheck -S warning -e SC2034,SC2154,...严格校验排除项如SC2034变量看似未使用正是考虑到教程片段中定义的变量会在后续片段使用的教学场景。这套机制从侧面印证了本文菜单脚本的写法case分支、颜色函数、exit 0退出是符合 shellcheck 警告级别要求的规范代码。你写完自己的menu.sh后也可以用同样的方式自检shellcheck menu.sh六、延伸这个菜单还能怎么用掌握交互式菜单范式后你可以把它迁移到仓库后续章节的真实场景中第 17 章《在多台远程服务器上执行 Bash 脚本》 直接复用了本章的检查函数集memory_check、cpu_check、tcp_check、kernel_check只是将菜单层替换为 SSH 批量循环——这说明功能函数与交互界面分离的设计让脚本极易复用将case的匹配值扩展为更友好的语义字符串如quit、all或通过read -p携带提示、用select内置命令生成编号菜单都是自然的升级方向颜色函数可以扩充更多色号\e[33m黄、\e[36m青等和样式\e[1m加粗用于区分不同级别的输出。结语至此你已掌握 Bash 交互式菜单的完整构建方法先用函数封装业务逻辑再用 ANSI 转义码优化视觉呈现最后用case分支 menu递归调用实现选择-执行-循环-退出的交互闭环。这个模式可以内嵌到任何需要用户做出多选一的脚本中——从系统监控工具到部署向导都适用。建议在本地终端中亲手运行一遍menu.sh故意输入几个非法字符观察默认分支的容错行为然后按自己的需求增删菜单项。当你需要确认脚本写法符合规范时仓库的 scripts/shellcheck-ebook.sh 就是现成的参考答案。继续阅读下一章第 17 章远程批量执行看看这套检查函数如何被改造成一条命令跑遍所有服务器的运维利器。【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

ADRC自抗扰控制实战:嵌入式轻量化实现与工程落地 2026/9/17 7:25:33

ADRC自抗扰控制实战:嵌入式轻量化实现与工程落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AI工具助力自考论文写作:九大工具实战评测与高效方案 2026/9/17 7:25:33

AI工具助力自考论文写作:九大工具实战评测与高效方案

1. 论文写作痛点与AI工具的价值写毕业论文是每个自考生都要经历的一道坎。作为过来人,我深知自考生的三大困境:时间碎片化、学术资源有限、缺乏系统指导。白天上班晚上带娃,周末还要抽空学习,这种状态下要完成一篇8000字以上的毕业…

阅读更多 →
gm/ID方法实战:从特征曲线到运放尺寸计算的完整流程 2026/9/17 7:25:33

gm/ID方法实战:从特征曲线到运放尺寸计算的完整流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Cursor与编程模型:AI编程工作流搭建及跨文件重构实战 2026/9/17 7:25:33

Cursor与编程模型:AI编程工作流搭建及跨文件重构实战

最近在开发者群里待着,话题绕来绕去总会撞到两个词:一个是Grok 4.5,一个是Cursor。标题里那句"Cursor 数据喂出来的编程模型",看着像一句调侃,其实戳中了一个很实在的技术判断——过去两年真正稀缺的&#x…

阅读更多 →
pentagi实战:五组件架构打造可观测的通用Agent智能体 2026/9/17 7:25:33

pentagi实战:五组件架构打造可观测的通用Agent智能体

最近一段时间,我频繁在开发者社区和几个技术群里看到pentagi被反复提及。一开始我以为又是什么套壳的 Agent 框架,直到我把它拉下来跑了一个星期,才意识到这个项目切入的角度确实有点东西:它没有把精力放在“多 Agent 聊天”或者“…

阅读更多 →
UFS逻辑单元管理详解:概念、配置与排障实战 2026/9/17 7:22:33

UFS逻辑单元管理详解:概念、配置与排障实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞