Shell script menu problem


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Shell script menu problem
# 1  
Old 02-15-2012
Shell script menu problem

I have tried searching the forum but i haven't found a solution for this.

I have a shell script that presents the users with menus. The menus branch out to sub menus. It is all hunky dory as long as i traverse forward. But if i am in a sub menu and return to the previous menu and choose any option, i am taken back to the sub menu. I can see where i am going wrong in my code as you can see highlighted below. But i cannot get around it unless i return to the main menu which has become quite cumbersome. Is there any way i can get around this by using goto labels? Any other modification of my code to get around this issue will be appreciated as well. Thanks in advance
Code:
 
function mainmenu {
echo "--------------- MAIN MENU -------------------"
echo " 1. CH1 "
echo " 2. CH2 "
echo " 3. CH3 "
echo "Choose 1-3"
read choice
case $choice in
1)
    while :
    do
    submenu # calling another menu here
    case $subchoice in
        1)
               do something
               ;;
        2) 
              do something
              ;;
        3)
              do something
              ;;
        4)
              do something
             ;;
        5)
             mainmenu
             ;;
        6)
             uexit                    #  calling the function to exit
             exit 1 
             ;;
        esac
       done
       ;;
2)
     while :
     do
               submenu2 # calling another menu here
            case $subchoice2 in
            1)
                   do something
                   ;;
           2)
                  do something
                  ;;
           3)
                 while :
                 do
                                submenu3 # calling another menu here
                         case $subchoice3 in
                         1)
                                  do something
                                  ;;
                        2)
                                 do something
                                 ;;
                       3)
                                do something
                                ;;
                      4)
                               do something
                               ;;
                      5)
                                      submenu2
                              ;;
                     6)
                              uexit
                              exit 1 
                             ;;
                     esac
                    done
                    ;;
          4)
                    do something
                     ;;
          5) 
                    mainmenu
                     ;;
          6)
                     uexit
                    exit 1  
                     ;;
          esac
        done 
       ;;
3)
      do something
       ;;
4)
      uexit
      exit 1
    ;;
esac
return
}
mainmenu


Last edited by goddevil; 02-15-2012 at 03:28 PM..
# 2  
Old 02-15-2012
Without seeing what you're doing in your submenus, it's difficult to tell what's going wrong with them.

There may be a way to simplify this a lot with select. Working on it.

What's your system, what's your shell? Do you have functions?
# 3  
Old 02-15-2012
Here's a long-winded way that may help point you in the right direction by putting the menus in functions:

Code:
#!/bin/bash


function main_menu()
{
    while :
    do
        echo
        echo "MAIN MENU"
        echo
        echo "1. Main Menu Option 1"
        echo "2. Main Menu Option 2"
        echo "3. Main Menu Option 3 To Sub-Menu"
        echo "4. Main Menu Option 4 To Quit"
        echo
        read -p "Choice: " m_choice
        echo
        
        case "$m_choice" in 
            1)  echo "Main Menu Option 1"
                echo
                ;;
            2)  echo "Main Menu Option 2"
                echo
                ;;
            3)  sub_menu
                ;;
            4)  exit 0
                ;;
            *)  echo "Bad Option"
                echo
                ;;
        esac
    done
}

function sub_menu()
{
    while :
    do
        echo
        echo "SUB MENU"
        echo
        echo "1. Sub-Menu Option 1"
        echo "2. Sub-Menu Option 2"
        echo "3. Sub-Menu Option 3 Back To Main Menu"
        read -p "Choice: " s_choice
        echo

        case "$s_choice" in
            1)  echo "Sub-Menu Option 1"
                echo
                ;;
            2)  echo "Sub-Menu Option 2"
                echo
                ;;
            3)  main_menu
                ;;
            *)  echo "Bad Option"
                echo
                ;;
        esac
    done
}

main_menu

exit 0

Hope this helps.
# 4  
Old 02-15-2012
Here's an example using select and the argument array to easily switch between many menus. The same code prints all the menus and reads all the replies using the select builtin.

We use the the $1 variable here to define which menu it's currently showing, which you can alter at will with the set -- and shift commands. You can easily use it like a stack, with [b]set -- nextmenu "$*"[b] pushing a menu to show next and shift popping a menu to return to the previous one.

But set -- will let you set menus in whatever arbitrary order you want, too.

Code:
#!/bin/bash

IFS="|" # Split menus on |, so we can have spaces in titles

# Use parameters as a stack.  $1 is the current menu.
# we can add with set -- again, or remove with 'shift'.
set -- main

while [ "$#" -gt 0 ]
do
        case "$1" in    # Look up the right options for the menu
        main)           OPTIONS="CH1|CH2|CH3|Q" ;;
        submenu1)       OPTIONS="A|B|C|Q"       ;;
        submenu2)       OPTIONS="D|E|F|Q"       ;;
        submenu3)       OPTIONS="X|Y|Z|Q"       ;;
        esac

        PS3=$'\n'"$1 menu: "    # Special variable controlling select prompt

        # Print menu, get reply
        select X in $OPTIONS
        do
                [ -z "$X" ] || break
        done

        # We treat Q specially, it returns to the previous menu.
        if [ "$X" = "Q" ]
        then
                shift           # Return to previous menu
                continue        # Go to top of loop
        fi

        case "$1" in
        main)
                case "$X" in
                CH1)    set -- submenu1 "$*"    ;;
                CH2)    set -- submenu2 "$*"    ;;
                CH3)    set -- submenu3 "$*"    ;;
                esac
                ;;

        submenu1)
                case "$X" in
                A)     # Switch to submenu2 by removing submenu1 before adding
                        shift
                        set -- submenu2 "$*"
                        ;;
                B)      ;;
                C)      ;;
                esac
                ;;

        submenu2)
                case "$X" in
                A)      ;;
                B)      ;;
                C)      ;;
                esac
                ;;

        submenu3)
                case "$X" in
                A)      ;;
                B)      ;;
                C)      ;;
                esac
                ;;

        *)      echo "Unknown menu $1, removing"
                shift
                ;;
        esac
done

echo "Menu list is empty, quitting" >&2


Last edited by Corona688; 02-15-2012 at 03:42 PM..
This User Gave Thanks to Corona688 For This Post:
# 5  
Old 02-15-2012
Quote:
Originally Posted by Corona688
Without seeing what you're doing in your submenus, it's difficult to tell what's going wrong with them.

There may be a way to simplify this a lot with select. Working on it.

What's your system, what's your shell? Do you have functions?
Sorry.. I should have been more specific... My OS is solaris.. Shell is bash... Everything in my script is a function.. The script itself is over 2000 lines with every "do something" in the code a function...

The submenus are exacly like the main menu that you see except it will only have the menu design and will willl read an input from the user. The processing of the read is done in the submenu.. for example:

Code:
function submenu {
echo "--------------- SUB MENU -------------------"
echo " 1. SUB CH1 "
echo " 2. SUB CH2 "
echo " 3. SUB CH3 "
echo " 4. SUB CH4 "
echo " 5. SUB CH5 "
echo " 6. SUB CH6 "
echo "Choose 1-6"
read subchoice
}
 
function submenu2 {
echo "--------------- SUB MENU 2 -------------------"
echo " 1. SUB2 CH1 "
echo " 2. SUB2 CH2 "
echo " 3. SUB2 CH3 "
echo " 4. SUB2 CH4 "
echo " 5. SUB2 CH5 "
echo " 6. SUB2 CH6 "
echo "Choose 1-6"
read subchoice2
}
 
function submenu3 {
echo "--------------- SUB MENU 3-------------------"
echo " 1. SUB3 CH1 "
echo " 2. SUB3 CH2 "
echo " 3. SUB3 CH3 "
echo " 4. SUB3 CH4 "
echo " 5. SUB3 CH5 "
echo " 6. SUB3 CH6 "
echo "Choose 1-6"
read subchoice3
}

P.S: I have modified my original post to show that the main menu is a function. I have missed it and it must have been very confusing.. Sorry

Last edited by goddevil; 02-15-2012 at 04:04 PM..
# 6  
Old 02-15-2012
I think we crossposted. Have a look at my general-purpose bash menu system there Smilie
# 7  
Old 02-15-2012
Quote:
Originally Posted by Corona688
I think we crossposted. Have a look at my general-purpose bash menu system there Smilie
Thanks a mil...That looks very interesting.. I will try it as soon as i have access to a terminal.

The only thing is, the number is options in my menus are usually 10 or more and the option is uaually something like "Show logs that belong to the XX service" and such. I have never used select before as well so i am a bit apprehensive. I am excited to try this out at the same time

---------- Post updated at 08:19 PM ---------- Previous update was at 08:10 PM ----------

Quote:
Originally Posted by in2nix4life
Here's a long-winded way that may help point you in the right direction by putting the menus in functions:

Code:
#!/bin/bash
 
 
function main_menu()
{
    while :
    do
        echo
        echo "MAIN MENU"
        echo
        echo "1. Main Menu Option 1"
        echo "2. Main Menu Option 2"
        echo "3. Main Menu Option 3 To Sub-Menu"
        echo "4. Main Menu Option 4 To Quit"
        echo
        read -p "Choice: " m_choice
        echo
 
        case "$m_choice" in 
            1)  echo "Main Menu Option 1"
                echo
                ;;
            2)  echo "Main Menu Option 2"
                echo
                ;;
            3)  sub_menu
                ;;
            4)  exit 0
                ;;
            *)  echo "Bad Option"
                echo
                ;;
        esac
    done
}
 
function sub_menu()
{
    while :
    do
        echo
        echo "SUB MENU"
        echo
        echo "1. Sub-Menu Option 1"
        echo "2. Sub-Menu Option 2"
        echo "3. Sub-Menu Option 3 Back To Main Menu"
        read -p "Choice: " s_choice
        echo
 
        case "$s_choice" in
            1)  echo "Sub-Menu Option 1"
                echo
                ;;
            2)  echo "Sub-Menu Option 2"
                echo
                ;;
            3)  main_menu
                ;;
            *)  echo "Bad Option"
                echo
                ;;
        esac
    done
}
 
main_menu
 
exit 0

Hope this helps.

That is exactly how i have it and it will work fine as long as you do not have another submenu "sub_menu_2" inside inside the function "sub_menu"... In this case, when you call the function "sub_menu_2" and then return back to "sub_menu", any choice you make will take you to "sub_menu_2"... This is because, "sub_menu_2" calls "sub_menu" and when you choose an option , it simply returns back after the call and still in the while loop in "sub_menu_2"
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to include menu based options in Shell script?

Hi Friends, I have a menu based tool which requires input/option to proceed further. How to make a shell script ? eg: menu looks like Get_data.sh to continue (y/n) : Here I need to key in "y" to proceed. I want to prepare a script which should consider option y. (5 Replies)
Discussion started by: suresh3566
5 Replies

2. Shell Programming and Scripting

Automate the menu options using shell script

I have a menu option which will look as follows Select a menu option 1.change password 2.login as root user 3.show system version 4.quit Select> 1 please enter the new password: unix reenter the new password: unix press any key to enter (then displays again the menu options to enter the... (4 Replies)
Discussion started by: shivakumar6g
4 Replies

3. Shell Programming and Scripting

Menu shell script help

Hi All, I have written a shell script that show menu driven option. My requirement is that in the menu driven option i want to select multiple choice. i.e if i want to select 1 or 1,2 or 1,2,3 or 2,3 etc .... Can some one help me in that My script. while true; do echo " " ... (8 Replies)
Discussion started by: Nawrajesh
8 Replies

4. Shell Programming and Scripting

A selection menu in a shell script

I'm writing a shell script and have a problem with selection when I issue the command, is there a way to automatically choose a selection number one after a selection menue appear Command 1-choice 2- choice 3-choice Thanks Sara (3 Replies)
Discussion started by: Sara_84
3 Replies

5. Shell Programming and Scripting

Execution Problem with dispalying file content using menu driven script

HI All.. below is my menu options script. in option 2,3 and 4 im giving input and they are saving into their respective text file. problem is when im trying to "cat" those files in options 7,8 and 9 im not getting the output. no respective file contents are displaying on screen. but if i... (1 Reply)
Discussion started by: saichand1985
1 Replies

6. Shell Programming and Scripting

Menu using shell script

Hi, I need to have a shell script for the below need. 1. Menu with one heading and 4 options. 2. the heading and 4 options are taken from a file. File entry ====== Heading1|option1|option2|option3|option4| Heading2|option1|option2|option3|option4| 3. the user entries must be captured in... (9 Replies)
Discussion started by: umastinu
9 Replies

7. UNIX for Dummies Questions & Answers

Menu Script problem

Im new to unix/linux and am having trouble with this one. My problem is when i enter 9 to exit it doesnt do so. also option 6 doesent display the time. Its getting to be frustrating. I know there are probably alot of bug in this bu these basic ones are really odd. #!bin/bash # until ... (3 Replies)
Discussion started by: christ.666
3 Replies

8. Shell Programming and Scripting

Shell script menu

hi guys, how would you do the following? I have a menu with 5 options in my shell script: 1. Run function 1 against files 2. Run function 2 against files 3. Run function 3 against files 4. Run function 4 against files 5. Run function 5 against files I'd like to be able to run multiple... (10 Replies)
Discussion started by: rich@ardz
10 Replies

9. Shell Programming and Scripting

Script menu problem

Hi there, I am new to Unix and at the moment I am trying to solve my assignment that is to create a script for the program to prompt user to type three codes, from user point of view it should be done by typing codes separating them by spaces. Then program displays a menu with these three... (2 Replies)
Discussion started by: Dannel
2 Replies

10. Shell Programming and Scripting

Unix Shell Script: With Menu Option

I am attempting to create a shell script with the following capaciblities: 1. Listed options to choice from 2. Use to perform awk statements 3. Print a report with the awk results My questions are 1. How do I select more than one file for option #5 and #6 2. How to I create an... (11 Replies)
Discussion started by: jroberson
11 Replies
Login or Register to Ask a Question