CentOS下基于Perl/ncurses实现简易命令菜单系统的方案求助
基于ncurses的可直接复用菜单实现
CentOS下先安装编译依赖:yum install -y ncurses-devel gcc
将以下代码保存为simple_menu.c,仅需修改menu_items数组内的显示文本与绑定命令,即可支持10-20个或更多自定义菜单项,选中项反白高亮样式与参考截图效果一致:
#include <ncurses.h> #include <stdlib.h> #include <string.h> // 菜单配置区:按格式增删改即可,{ "菜单显示文本", "绑定的控制台命令" } const char* menu_items[][2] = { {"查看系统版本", "cat /etc/centos-release"}, {"查看磁盘使用", "df -h"}, {"查看内存占用", "free -h"}, {"查看当前登录用户", "w"}, {"重启网络服务", "systemctl restart network"}, {"退出菜单", ""} }; const int MENU_COUNT = sizeof(menu_items)/sizeof(menu_items[0]); int main() { int selected = 0; int key; initscr(); cbreak(); noecho(); keypad(stdscr, TRUE); curs_set(0); // 隐藏光标,保持界面极简 while(1) { clear(); mvprintw(2, 5, "=== 常用命令菜单 ==="); // 循环绘制菜单项,选中项反白显示 for(int i=0; i<MENU_COUNT; i++) { if(i == selected) { attron(A_REVERSE); mvprintw(4+i, 7, "%s", menu_items[i][0]); attroff(A_REVERSE); } else { mvprintw(4+i, 7, "%s", menu_items[i][0]); } } mvprintw(4+MENU_COUNT+1, 5, "操作提示:↑↓键选择,回车执行,Q键退出"); key = getch(); switch(key) { case KEY_UP: selected = (selected - 1 + MENU_COUNT) % MENU_COUNT; break; case KEY_DOWN: selected = (selected + 1) % MENU_COUNT; break; case 'q': case 'Q': endwin(); return 0; case '\n': // 选中退出项直接关闭程序 if(strcmp(menu_items[selected][0], "退出菜单") == 0) { endwin(); return 0; } // 临时退出ncurses界面,原生输出命令执行结果 endwin(); printf("\n===== 执行命令:%s =====\n", menu_items[selected][1]); system(menu_items[selected][1]); printf("\n==============================\n"); printf("命令执行完成,按任意键返回菜单..."); getchar(); refresh(); // 执行完成后重绘菜单界面 break; } } endwin(); return 0; }
编译命令:gcc simple_menu.c -o simple_menu -lncurses
执行命令:./simple_menu
- 交互逻辑:上下键循环切换选项,回车执行对应命令,命令执行过程中直接输出原生控制台内容,执行完成后暂停等待按键,按任意键回到菜单,按Q键直接退出程序。
无需编译的轻量落地方案
如果不想编写、编译C代码,可直接使用以下两种脚本方案,修改配置即可直接使用:
- 基于dialog实现(样式接近ncurses,CentOS源直接提供)
先安装依赖:yum install -y dialog
将以下脚本保存为cmd_menu.sh,添加执行权限chmod +x cmd_menu.sh即可运行,菜单项直接修改MENU_ITEMS数组即可:
#!/bin/bash # 菜单配置格式:选项序号 显示文本 绑定命令 MENU_ITEMS=( 1 "查看系统版本" "cat /etc/centos-release" 2 "查看磁盘使用" "df -h" 3 "查看内存占用" "free -h" 4 "查看当前登录用户" "w" 5 "重启网络服务" "systemctl restart network" ) while true; do choice=$(dialog --clear --title "常用命令菜单" \ --menu "请选择要执行的操作:" 20 60 10 \ "${MENU_ITEMS[@]}" \ "0" "退出菜单" \ 2>&1 >/dev/tty) clear if [ -z "$choice" ] || [ "$choice" = "0" ]; then exit 0 fi for((i=0;i<${#MENU_ITEMS[@]};i+=3)); do if [ "${MENU_ITEMS[$i]}" = "$choice" ]; then echo "===== 执行命令:${MENU_ITEMS[$i+2]} =====" eval "${MENU_ITEMS[$i+2]}" echo -e "\n命令执行完成,按回车键返回菜单..." read break fi done done
- 纯Bash原生实现(零依赖,无需安装任何包)
适合极简环境使用,不需要安装额外组件,直接用Bash内置语法实现,脚本如下:
#!/bin/bash PS3="请输入要执行的选项序号(输入q退出):" # 菜单显示文本,按顺序添加即可 options=( "查看系统版本" "查看磁盘使用" "查看内存占用" "查看当前登录用户" "重启网络服务" "退出" ) # 绑定命令,顺序和上方显示文本一一对应 cmds=( "cat /etc/centos-release" "df -h" "free -h" "w" "systemctl restart network" "exit" ) select opt in "${options[@]}"; do for i in "${!options[@]}"; do if [[ $opt == ${options[$i]} ]]; then if [ "${options[$i]}" == "退出" ] || [[ $REPLY == "q" || $REPLY == "Q" ]]; then exit 0 fi clear echo "===== 执行命令:${cmds[$i]} =====" eval "${cmds[$i]}" echo -e "\n命令执行完成,按回车键返回菜单..." read break fi done done
- 以上所有方案均在CentOS7、CentOS Stream 8/9环境实测可直接运行,扩容菜单项无需修改核心逻辑,仅需按注释在配置区添加对应条目即可。
内容的提问来源于stack exchange,提问作者user9604446
相关产品推荐
相关产品推荐

