Bash子菜单(选择加入)

时间:2014-04-23 10:51:56

标签: linux bash menu

我正在尝试通过 选择加入 ,使用子菜单创建一个完整的 BASH 菜单。

问题:当我进入子菜单然后返回初始菜单时,它不会显示选项。

----------------------------------------------
          Greenwatch's Kiosk debug menu
----------------------------------------------

1) Keyboard Layout,             5) Configure Kiosk's password,
2) Timezone configuration,      6) Set Proxy,
3) -,                           7) Remove Proxy
4) Launch Kiosk anyway,
Enter your choice (mainmenu), press 0 to reboot: 1


1) Azerty layout (BE)
2) Querty layout (US)
3) Cancel
Enter your choice (submenu): 1
AZERTY Keyboard configured

Enter your choice (mainmenu), press 0 to reboot: 

这是代码(简化 - 只有一个子菜单 - )

choose_keyboard() {
    show_title "Choose your keyboard layout"
    clear;
    select opt in "Azerty layout (BE)" "Querty layout (US)" "Cancel"; do
        case "$REPLY" in
            1 ) loadkeys be-latin1; echo "AZERTY Keyboard configured"; break;;
            2 ) loadkeys us; echo "QWERTY Keyboard configured"; break;;
            3 ) echo "Canceled"; break;;
            777 ) break;;
            *) echo "This is not a valid option, retry";;
        esac
    done
}
main_menu() {
    show_title "$title"
    select opt in "${options[@]}"; do 
        case "$REPLY" in
            0 ) show_title "See you as late as possible!"; sudo systemctl reboot;;
            1 ) choose_keyboard;;
            2 ) choose_timezone;;
            3 ) lauch_kiosk;;
            4 ) choose_password;;
            5 ) choose_ipconfig;;
            6 ) choose_proxy;;
            7 ) choose_testlab;;
            777 ) break;;
            *) echo "This is not a valid option, retry";;
        esac
    done
}
main_menu

如何强制 选择 来显示菜单? 注意:如果我将main_menu调用到choose_keyboard函数中,我肯定会收到stackoverflow错误!

1 个答案:

答案 0 :(得分:2)

当您从内部break select时,您重新进入顶部(主菜单)select - 正如您所发现的那样,菜单不会显示,因为您不会重新执行函数开头的命令。相反,您可以立即突破内部和外部选择,并将主菜单放在循环中,以便再次调用它,即:

1 ) loadkeys be-latin1; echo "AZERTY Keyboard configured"; break 2;;

break 2会突破选择嵌套在另一个内部,break 3会突破其他级别的嵌套等等。然后,不要只是在底部调用main_menu,而是类似的东西:

while :; do main_menu; done

这是一个无限循环,只要你突破主菜单main_menu命令就会调用select。你可能不希望它是无限的,你总是可以测试一个变量或那里的东西。