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

関連情報