2012-03-08 8 views
5

Tienen el siguiente shell, que tiene un ciclo (mientras que es verdadero) dentro de un ciclo (mientras que es verdadero). Estoy tratando de romper el ciclo interno usando un "descanso" pero no es así. Quiero romper el lazo interno & mostrar al usuario las opciones del primer ciclo; sugerencias por favor.Ciclo de ruptura de shell while-verdadero

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

Aquí está la salida:

~~~~~~~~~~~~~~~~~~~~~ 
    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

Lea sobre el comando 'select' en la página de manual ksh. –

+0

+1 para una buena descripción del problema, muestra de salida Y parte del código real. Buena suerte. – shellter

+0

@shellter muchas gracias! – sid

Respuesta

7

La siguiente secuencia de comandos funciona aquí.

Los cambios realizados fuera a tener read_sub_options retorno 2 si sub_menu fue llamado y devuelve 1 cuando se seleccionó la opción Volver a continuación, compruebe el valor de retorno de la última orden de marcha en showSubMenu y romper si se ha seleccionado Volver.

Consulte KSH script basics y Learning the Korn shell para obtener más información de referencia de scripts de KSH.

Consulte select y la página de manual de ksh para obtener información sobre un método alternativo de selección de menú como se menciona en el comentario de su pregunta.

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

gracias probé este enfoque funciona perfecto; y sí, mi primer enfoque fue usar select (soy un novato con shell, y cuando busqué en Google obtuve referencias usando select); pero de alguna manera no pude hacer ese trabajo en nuestra instalación de Sun Unix ... de todos modos. A veces, los enfoques tediosos y básicos funcionan perfectamente y también funcionan esta vez. – sid

1

La cáscara tiene 'siempre' apoyados:

break 2 

para romper dos niveles de bucle shell. Incluso la 7ma Edición UNIX ™ Bourne Shell hizo eso.

0

Está tratando de salir de un bucle fuera de una función desde dentro de esa función. No está del todo claro para mí si esto debería funcionar, pero he descubierto que no funciona con ksh93, mksh y el shell Heirloom Bourne, mientras que funciona con bash, ash (como el tablero y FreeBSD sh) y zsh.

En su lugar, puede devolver un estado especial y romper en la misma función que el bucle, como en una de las otras respuestas.