2012-03-08 17 views
5

Avere la seguente shell, che ha un ciclo (while true) all'interno di un ciclo while (true). Sto cercando di rompere il loop interno usando una "pausa", ma non lo è. Voglio rompere il ciclo interno & visualizzare all'utente le opzioni del primo ciclo; suggerimenti pls.Interruzione shell while-true loop

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

Ecco l'output:

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

Leggere il comando 'select' nella manpage ksh. –

+0

+1 per la descrizione del problema, l'output di esempio e un codice effettivo. In bocca al lupo. – shellter

+0

@shellter grazie mille! – sid

risposta

7

Lo script che segue lavora qui.

Le modifiche apportate dovevano avere read_sub_options ritorno 2 se sub_menu è stato chiamato e ritornare 1 quando l'opzione posteriore è stata selezionata e quindi controllare il valore di ritorno dell'ultimo comando di marcia in showSubMenu e rompersi se è stato selezionato Indietro.

Vedere KSH script basics e Learning the Korn shell per ulteriori informazioni di riferimento di script KSH.

Vedere select e la pagina man ksh per informazioni su un metodo alternativo di selezione del menu come indicato nel commento della domanda.

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

grazie ho provato questo approccio funziona perfettamente; e sì il mio primo approccio era usare select (sono un novizio in shell, e quando ho cercato su google ho riferimenti usando select); ma in qualche modo non ero in grado di fare quel lavoro sulla nostra installazione sole unix .. comunque. A volte gli approcci noiosi e di base funziona perfettamente e funziona anche questa volta !!! – sid

1

La scocca è 'sempre' supportato:

break 2 

per rompere due livelli di ciclo shell. Anche la 7th Edition UNIX ™ Bourne shell lo ha fatto.

0

Si sta tentando di interrompere da un ciclo esterno a una funzione dall'interno di quella funzione. Non è del tutto chiaro per me se questo dovrebbe funzionare, ma ho scoperto che non funziona con ksh93, mksh e la shell di Heirloom Bourne, mentre funziona con bash, ash (come dash e FreeBSD sh) e zsh.

È possibile restituire uno stato speciale e interrompere la stessa funzione del ciclo, come in una delle altre risposte.