Bash 脚本 - 退出子菜单

Bash 脚本 - 退出子菜单

退出子菜单时遇到问题。一探究竟:

function submenu
{
select submenu1 in "Submenu 1" "Submenu 2" "Submenu 3" "Exit to main menu"; do
    case $submenu1 in
        "Submenu 1" ) echo "SubMenu1"; ;;
        "Submenu 2" ) echo "SubMenu1"; ;;
        "Submenu 3" ) echo "SubMenu1"; ;;
        "Exit to main menu" ) break;;
        * ) echo "Please select an option."; ;;
    esac
done
}

select mainMenu in "Main Menu 1" "Main Menu 2" "Main Menu 3" "Quit"; do
    case $mainMenu in
        "Main Menu 1" ) submenu; ;;
        "Main Menu 2" ) echo "MainMenu2"; ;;
        "Main Menu 3" ) echo "MainMenu3"; ;;
        Quit ) exit;;
        * ) echo "Please select an option.";
    esac
done

如果用户从主菜单中选择1,则子菜单功能启动。如果用户输入“4”并按回车键,它就会保留在那里。如果他们再次按回车键,那么它会弹出回到主菜单。

不知道我错过了什么,我觉得这很简单。

答案1

您唯一缺少的是这是完全有意的行为。

当您在主菜单中按 2 时,会发生什么?

1) Main Menu 1
2) Main Menu 2
3) Main Menu 3
4) Quit
#? 2
MainMenu2
#?

执行该echo "MainMenu2"命令,然后#?重新显示提示符。没有其他的。执行所选命令,并#?重新显示提示符。如果再次按 Enter 键(空输入),将重新显示菜单选项。

如果您进入子菜单,然后再退出,您会得到一致的行为:#?重新显示提示。如果再次按 Enter 键(空输入),将重新显示菜单选项。

答案2

要强制重新显示菜单,请在 周围添加一个外循环,并在选择选项时select始终在循环break外。select另外,不要在case ... esac语句中使用实际的菜单项,而是使用数字,这使代码更具可读性,也更易于维护。

submenu() {
    while true; do
        select submenu1 in 'Submenu 1' 'Submenu 2' 'Submenu 3' 'Exit to main menu'
        do
            case $REPLY in
                1) echo 'SubMenu1' ;;
                2) echo 'SubMenu2' ;;
                3) echo 'SubMenu3' ;;
                4) break 2 ;;
                *) echo 'Please select an option.' >&2
            esac
            break
        done
    done
}

while true; do
    select mainMenu in 'Main Menu 1' 'Main Menu 2' 'Main Menu 3' 'Quit'
    do
        case $REPLY in
            1) submenu ;;
            2) echo 'MainMenu2' ;;
            3) echo 'MainMenu3' ;;
            4) break 2 ;;
            *) echo 'Please select an option.' >&2
        esac
        break
    done
done

相关内容