Скрипт Bash Shell: вложенные выбранные операторы - PullRequest
2 голосов
/ 08 апреля 2010

У меня есть скрипт, в котором есть оператор Select для перехода к нескольким операторам sub select, однако, как только я не могу понять, как заставить его вернуться к основному сценарию. также, если это возможно, я бы хотел, чтобы он перечислил опции

  #!/bin/bash
           PS3='Option = '
           MAINOPTIONS="Apache Postfix Dovecot All Quit"
           APACHEOPTIONS="Restart Start Stop Status"
           POSTFIXOPTIONS="Restart Start Stop Status"
           DOVECOTOPTIONS="Restart Start Stop Status"
           select opt in $MAINOPTIONS; do
               if [ "$opt" = "Quit" ]; then
               echo Now Exiting
               exit
               elif [ "$opt" = "Apache" ]; then
                 select opt in $APACHEOPTIONS; do
                 if [ "$opt" = "Restart" ]; then
                 sudo /etc/init.d/apache2 restart
                 elif [ "$opt" = "Start" ]; then
                 sudo /etc/init.d/apache2 start
                 elif [ "$opt" = "Stop" ]; then
                 sudo /etc/init.d/apache2 stop
                 elif [ "$opt" = "Status" ]; then
                 sudo /etc/init.d/apache2 status
                 fi
                 done
               elif [ "$opt" = "Postfix" ]; then
                 select opt in $POSTFIXOPTIONS; do
                 if [ "$opt" = "Restart" ]; then
                 sudo /etc/init.d/postfix restart
                 elif [ "$opt" = "Start" ]; then
                 sudo /etc/init.d/postfix start
                 elif [ "$opt" = "Stop" ]; then
                 sudo /etc/init.d/postfix stop
                 elif [ "$opt" = "Status" ]; then
                 sudo /etc/init.d/postfix status
                 fi
                 done
               elif [ "$opt" = "Dovecot" ]; then
                 select opt in $DOVECOTOPTIONS; do
                 if [ "$opt" = "Restart" ]; then
                 sudo /etc/init.d/dovecot restart
                 elif [ "$opt" = "Start" ]; then
                 sudo /etc/init.d/dovecot start
                 elif [ "$opt" = "Stop" ]; then
                 sudo /etc/init.d/dovecot stop
                 elif [ "$opt" = "Status" ]; then
                 sudo /etc/init.d/dovecot status
                 fi
                 done
                 elif [ "$opt" = "All" ]; then
                 sudo /etc/init.d/apache2 restart
                 sudo /etc/init.d/postfix restart
                 sudo /etc/init.d/dovecot restart
               fi
               done

Ответы [ 3 ]

6 голосов
/ 08 апреля 2010

Обычно вы вкладываете case операторы в select операторы и помещаете все это в цикл:

while true
do
    select option in $options
    do
        case $option in
            choice1)
                do_something
                ;;
            choice2)
                select sub_option in $sub_options
                do
                    case $sub_option in
                        sub_choice1)
                            another_thing
                            ;;
                        sub_choice2)
                            break    # return to current (sub) menu
                            ;;
                        sub_choice3)
                            break 2  # return to parent menu
                            ;;
                     esac
            choice3)
                 break    # return to current (main) menu
                 ;;
            choice4)
                 break 2  # exit the while loop so cleanup can be done at the end of the script
        esac
    done
done
do_cleanup
3 голосов
/ 08 апреля 2010

вы используете цикл, чтобы сделать это ..

while true
do
...
...
  read -p "do you want to continue (Q)uit?" choice
  case "$choice" in
    Q|q) break;; #or exit your script
  esac
...
done
2 голосов
/ 08 апреля 2010

Оболочка Борна имеет полезную конструкцию, которую я иногда хотел бы иметь у С.

Вы можете разорвать вложенные управляющие структуры с помощью «break n», где n может быть 2, 3 и т. Д.

Итак, из вашего вложенного подвыбора вы можете выдать break 2;, чтобы вернуться на верхний уровень. Я не совсем уверен, что вы пытаетесь достичь, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...