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"를 입력하고 Enter 키를 누르면 그대로 유지됩니다. Enter를 다시 누르면 기본 메뉴로 다시 팝업됩니다.

내가 무엇을 놓치고 있는지 잘 모르겠지만 이것이 간단하다고 생각합니다.

답변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

관련 정보