2012-03-08 2 views
5

Имеет следующую оболочку, которая имеет цикл while (while true) внутри цикла while (while). Я пытаюсь разбить внутренний цикл, используя «break», но это не так. Я хочу разбить внутренний контур & показать пользователю параметры 1-го цикла; предложения pls.Оболочка прерывания во время работы

#!/bin/ksh 
    sub_menu() { 
    echo "~~~~~~~~~~~~~~~~~~~~~~~~~"  
    echo " S U B - M E N U " 
    echo "~~~~~~~~~~~~~~~~~~~~~~~~~" 
    echo "1. Display properties" 
    echo "2. Back" 
    } 

    read_sub_options(){ 

    echo "Please select option" 
    read option 
    case $option in 
     1) sub_menu ;; 
     ***2) break ;;*** 
     *) echo "Please insert options 1 ~ 2";; 
     esac 
    } 

showSubMenu(){ 
    while true 
    do 
     sub_menu 
     read_sub_options 
done  
} 

read_options(){ 
echo "Please select option " 
    read option 
    case $option in 
     1) showSubMenu ;; 
     2) exit 0;; 
     *) echo "Please insert options ";; 
    esac 
} 

show_menus() { 
    echo "~~~~~~~~~~~~~~~~~~~~~"  
    echo " M A I N - M E N U " 
    echo "~~~~~~~~~~~~~~~~~~~~~" 
    echo "1. Sub Menu" 
    echo "2. Exit" 
} 

# ----------------------------------- 
#   MAIN 
# ------------------------------------ 
while true 
do 
    show_menus 
    read_options 
done 

Вот результат:

~~~~~~~~~~~~~~~~~~~~~ 
    M A I N - M E N U 
~~~~~~~~~~~~~~~~~~~~~ 
1. Sub Menu 
2. Exit 
Please select option 
1 
~~~~~~~~~~~~~~~~~~~~~~~~~ 
    S U B - M E N U 
~~~~~~~~~~~~~~~~~~~~~~~~~ 
1. Display properties 
2. Back 
Please select option 
2 
~~~~~~~~~~~~~~~~~~~~~~~~~ 
    S U B - M E N U 
~~~~~~~~~~~~~~~~~~~~~~~~~ 
1. Display properties 
2. Back 
Please select option 
2 
+0

Подробнее о команде 'select' в man-странице ksh. –

+0

+1 для описания хорошей проблемы, выход образца И некоторый фактический код. Удачи. – shellter

+0

@shellter большое спасибо! – sid

ответ

7

Следующий скрипт работает здесь.

Внесенные изменения должны были иметь read_sub_options return 2, если было вызвано sub_menu и возвращено 1, когда была выбрана опция «Назад», а затем проверьте возвращаемое значение последней команды запуска в showSubMenu и перерыв, если выбрано Назад.

См. KSH script basics и Learning the Korn shell для дальнейшей справочной информации по KSH.

См. select и справочную страницу ksh для получения информации о альтернативном методе выбора меню, как указано в комментарии к вашему вопросу.

#!/bin/ksh 
sub_menu() { 
echo "~~~~~~~~~~~~~~~~~~~~~~~~~"  
echo " S U B - M E N U " 
echo "~~~~~~~~~~~~~~~~~~~~~~~~~" 
echo "1. Display properties" 
echo "2. Back" 
return 2; 
} 

read_sub_options(){ 

echo "Please select option" 
read option 
case $option in 
    1) sub_menu ;; 
    2) return 1;; 
    *) echo "Please insert options 1 ~ 2";; 
    esac 
} 

showSubMenu(){ 
while true 
do 
    sub_menu 
    read_sub_options 
    if [[ $? == 1 ]] ; then 
    break 
    fi 
done  
} 

read_options(){ 
echo "Please select option " 
    read option 
    case $option in 
     1) showSubMenu;; 
     2) exit 0;; 
     *) echo "Please insert options ";; 
    esac 
} 

show_menus() { 
    echo "~~~~~~~~~~~~~~~~~~~~~"  
    echo " M A I N - M E N U " 
    echo "~~~~~~~~~~~~~~~~~~~~~" 
    echo "1. Sub Menu" 
    echo "2. Exit" 
} 

# ----------------------------------- 
#   MAIN 
# ------------------------------------ 
while true 
do 
    show_menus 
    read_options 
done 
+0

спасибо, что я пробовал этот подход, работает отлично; и да, мой первый подход - использовать select (я новичок в оболочке, а когда googled, я получил ссылки, используя select); но почему-то я не смог сделать эту работу на нашей установке sunix unix .. в любом случае. Иногда утомительные и базовые подходы прекрасно работают и работают на этот раз! – sid

1

Оболочка имеет 'всегда' при поддержке:

break 2 

сломать два уровня цикла оболочки. Даже 7-й выпуск UNIX ™ Bourne shell сделал это.

0

Вы пытаетесь выйти из цикла вне функции изнутри этой функции. Мне не совсем понятно, должно ли это работать, но я обнаружил, что он не работает с ksh93, mksh и оболочкой Birne Heirloom, в то время как он работает с bash, ash (например, тире и FreeBSD sh) и zsh.

Вместо этого вы можете вернуть специальный статус и разбить ту же функцию, что и цикл, как в одном из других ответов.

Смежные вопросы