2014-04-23 39 views
2

我想在通过选择选择做一个完整的BASH 菜单子菜单击子菜单(SELECT选择加入)

问题:当我去一个子菜单,然后回到初始菜单,它不显示选项。

---------------------------------------------- 
      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: 

这是代码(简化 - 附只有一个submenu-)

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错误!

回答

2

当你从内selectbreak,你重新进入顶部(主菜单)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命令。你可能不希望它是无限的,你可以随时测试一个变量或其他东西。

+0

这是完全按照需要工作! –