
在 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 的第 16 章展开讲解如何用 Bash 脚本实现一个可供用户多选操作项的交互式菜单。你将学会复用上一章编写的主机状态检测函数内存、CPU、TCP 连接数、内核版本通过 ANSI 颜色函数美化菜单界面并用read读取用户输入、用case语句分发处理逻辑最终产出一个可复制、可运行的menu.sh系统监控脚本。背景从状态检查脚本到交互菜单本教程是上一章「编写你的第一个 Bash 脚本」015-writing-your-first-bash-script.md的自然延续。上一章我们编写了一个status.sh它按顺序执行四类检查并一次性输出结果本章则把同样的检查能力封装成菜单选项让用户按需选择要执行哪一项检测而不是每次运行都全部执行一遍。这种「菜单驱动」的交互模式在运维与 DevOps 场景中非常常见将重复性的服务器巡检、批量操作、配置变更封装成一个脚本交给操作人员从菜单中点选执行降低误操作风险也省去记忆长命令的成本。规划功能先明确菜单脚本要提供的核心能力检查当前磁盘/内存使用情况实际脚本中以内存free -h体现检查当前 CPU 负载uptime检查当前 TCP 连接数量/proc/net/tcp检查精确的内核版本uname -r支持一键执行全部检查all_checks提供退出选项并对非法输入给出错误提示在此基础上原文档指出你可以根据自己的需求自由增删函数或调整菜单项——例如把free -h换成df -h来检查磁盘或增加ss -tunlp等新检测函数。复用上一章的函数菜单的「内容」部分上一章生成的脚本主体是一组相互独立、职责单一的函数本章直接复用它作为菜单的执行体#!/bin/bash ## # BASH menu 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 }几个值得注意的实现细节server_name$(hostname)利用命令替换把主机名存进变量检查输出中会动态带上当前服务器名该写法在上一章004-bash-variables.md中有详细讲解。函数定义的function name() { ... }结构与函数章节012-bash-functions.md中一致调用时不能带括号如all_checks内部直接写函数名。wc -l /proc/net/tcp通过输入重定向统计/proc/net/tcp的行数即当前已建立的 TCP 连接条目数减去表头一行即为连接数。/proc/net/tcp是 Linux 内核暴露的 TCP socket 状态伪文件在大多数 Linux 发行版上直接可读。uname -r只输出内核 release 版本号如5.15.0-91-generic比uname -a更精简。为菜单加入颜色ANSI 转义序列为了让菜单在一屏之内更容易被扫读原教程引入了一组「颜色变量 颜色函数」。它们基于 ANSI 转义序列实现原理是向终端输出控制码## # Color Variables ## green\e[32m blue\e[34m red\e[31m clear\e[0m ## # Color Functions ## ColorGreen(){ echo -ne ${green}${1}${clear} } ColorBlue(){ echo -ne ${blue}${1}${clear} }参数说明\e[32m绿色、\e[34m蓝色、\e[31m红色分别设置前景色数字对应 ANSI 颜色码31 红、32 绿、34 蓝。\e[0m变量名为clear负责重置所有样式保证颜色只作用于目标文本、不污染后续输出。颜色函数接受一个参数$1输出${1}前后包裹颜色码与重置码例如ColorGreen 1)会把1)渲染为绿色。echo -ne中的-n表示输出后不换行-e表示解释转义序列\e等两者缺一不可否则颜色码会被当作文本原样打印。使用方式非常简洁把任意字符串作为参数传入即可echo -ne $(ColorBlue Some text here)上述命令会在终端中输出蓝色的Some text here。原文档还预留了red变量用于后面提示「Wrong option」错误信息时使用。提示颜色码依赖终端对 ANSI 转义的支持绝大多数现代终端如 GNOME Terminal、iTerm2、VS Code 集成终端均支持如果输出到不支持转义的文件或管道会看到原始控制字符属正常现象。构建菜单主体menu函数与case分发核心的菜单逻辑被封装进一个名为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 }分步解读第一步打印菜单选项。用echo -ne配合双引号内嵌命令替换$(ColorGreen 1))逐行输出带颜色的菜单项。多行字符串直接写在双引号里echo会原样保留换行。第二步读取用户输入。read a把用户在终端输入的内容存入变量$a。关于read命令的更多用法如read -p提示符可参考用户输入章节005-bash-user-input.md。第三步case分发。根据$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这里需要理解三个关键设计递归返回菜单每个选项执行完对应函数后用分号;再次调用menu让用户执行完一次检查后自动回到菜单形成循环交互而无需重新运行脚本。通配模式*兜底当输入不在1-5与0之间时落入*)分支用红色打印Wrong option.并重新显示菜单。这是case语句的默认分支写法。退出出口输入0时执行exit 0以成功状态码退出脚本。case语句的完整语法规则模式用)结尾、子句以;;结束、可用|合并多个模式、esac关闭语句在条件判断章节010-bash-conditionals.md中有系统讲解本章正是它的实战应用。最后一步启动菜单。函数定义本身不会执行必须在脚本末尾显式调用# Call the menu function menu完整脚本将上述所有部分拼装起来最终的menu.sh如下与仓库中该章节016-creating-an-interactive-menu-in-bash.md给出的完整版本一致#!/bin/bash ## # BASH menu 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 } ## # Color Variables ## green\e[32m blue\e[34m red\e[31m clear\e[0m ## # Color Functions ## 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 } # Call the menu function menu运行与测试保存脚本后直接以bash解释器运行无需给文件加执行权限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:在Choose an option:后输入数字并回车对应函数即被触发输入1→ 打印free -h的内存使用情况输入2→ 打印uptime的 CPU 负载与运行时长输入3→ 打印 TCP 连接数输入4→ 打印内核版本输入5→ 依次执行全部四项检查输入0→ 退出脚本输入其他字符 → 显示红色Wrong option.并重新呈现菜单。每次检查完成后脚本会自动回到菜单等待下一次选择直到你输入0退出。进阶用 ShellCheck 验证脚本质量本书仓库在 scripts/shellcheck-ebook.sh 中提供了一个自动化工具它会提取ebook/en/content目录下所有 Markdown 文档中的bash代码块逐块写入临时文件并运行shellcheck -S warning静态检查从而保证书中所有示例脚本的代码质量。运行方式需本机安装shellcheck./scripts/shellcheck-ebook.sh # 或指定其他语言目录 ./scripts/shellcheck-ebook.sh ebook/es/content几个与本章代码直接相关的排除项说明SC2034变量声明后未使用与SC2154引用了未赋值的变量脚本片段中定义的颜色变量与跨片段引用的$server_name等在完整脚本上下文中才被使用故单独检查代码块时被排除。菜单输出等非可执行片段以1)数字开头等会被该脚本识别并跳过避免误报。如果你把本章的完整menu.sh拿去跑一次shellcheck可以得到更严格的建议例如read a可写成read -r a以保留反斜杠字面量、echo -e建议改用printf等——这些都是把「能用的脚本」升级为「健壮的脚本」的可选优化方向不影响本章核心逻辑。总结通过本章你掌握了在 Bash 中构建交互式多选菜单的完整套路把检测逻辑拆成独立函数作为菜单的「执行体」用 ANSI 颜色变量与颜色函数美化菜单可读性用read捕获用户输入用case语句完成输入分发与非法输入兜底用递归调用menu实现循环交互用exit 0提供退出通道。这套「打印菜单 → 读取输入 → case 分发 → 返回菜单」的模式可以无缝迁移到任何需要用户交互的 Bash 脚本中——无论是服务器巡检、备份选择、环境部署还是日常工具脚本你都可以把选择权交给用户。后续章节还会在此基础上进一步扩展例如通过 SSH 在远程多台服务器上执行这类脚本017-executing-bash-script-on-multiple-remote-server.md让同一份菜单驱动能力覆盖整个服务器集群。【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考