Оболочка перерыв пока-истинная петля - PullRequest
5 голосов
/ 09 марта 2012

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

#!/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

Ответы [ 3 ]

7 голосов
/ 09 марта 2012

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

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

См. Основы сценариев KSH и Изучение оболочки Korn для получения дополнительной справочной информации по сценариям KSH.

См. выберите и справочную страницу 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
1 голос
/ 09 марта 2012

В оболочке всегда поддерживается:

break 2

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

0 голосов
/ 09 марта 2012

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

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

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