You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:36:17