Bash scripting - saindo do submenu

1

Correndo para um problema ao sair de um submenu. Confira:

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

Se um usuário selecionar 1 no menu principal, a função do submenu será disparada. Se o usuário digitar "4" e pressionar "Enter", ele ficará lá. Se eles apertarem novamente, ENTÃO voltará ao menu principal.

Não tenho certeza do que sinto, sinto que é algo simples.

    
por guestAccountThanks 20.12.2017 / 00:10

2 respostas

1

A única coisa que está faltando é que esse é um comportamento totalmente intencional.

Quando você está no menu principal e pressiona 2, o que acontece?

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

O comando echo "MainMenu2" é executado e, em seguida, o prompt #? é exibido novamente. Nada mais. O comando selecionado foi executado e o prompt #? foi exibido novamente. Se você pressionar enter novamente (entrada vazia), as opções do menu serão exibidas novamente.

Se você entrar no submenu e sair dele, você obtém um comportamento consistente: o prompt #? é exibido novamente. Se você pressionar enter novamente (entrada vazia), as opções do menu serão exibidas novamente.

    
por 20.12.2017 / 00:39
1

Para forçar a reexibição do menu, adicione um loop externo em torno do select e sempre break do loop select quando uma opção tiver sido selecionada. Além disso, não use os itens de menu reais na instrução case ... esac , mas os números, que tornam o código mais legível e também mais fácil de manter.

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
    
por 05.05.2018 / 22:06