我正在试图通过selectselect进入一个完整的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
我怎么能强制select显示菜单? 注意:如果我调用main_menu进入choose_keyboard函数,我一定会得到一个stackoverflow错误!
当你从内部select
break
,你重新进入顶部(主菜单) select
– 正如你所发现的,菜单不显示,因为你不在函数的开始处重新执行命令。 相反,您可以一次打破内部和外部选择,并将主菜单放在一个循环中,以便再次调用,即:
1 ) loadkeys be-latin1; echo "AZERTY Keyboard configured"; break 2;;
break 2
会跳出一个选择嵌套在另一个中, break 3
会突破额外的嵌套级别等。然后,而不是只调用底部的main_menu
,做一些事情:
while :; do main_menu; done
这是一个无限循环,当你跳出主菜单select
命令时,它将调用main_menu
。 你可能不希望它是无限的,你可以随时测试一个变量或其他东西。