2012-03-08 171 views
5

有以下shell,它在(while true)循環中有一個(while true)循環。我試圖用「休息」打破內部循環,但事實並非如此。 我想打破內循環&顯示用戶第一循環的選項;建議請。Shell break while-true循環

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

閱讀ksh手冊頁中的'select'命令。 – 2012-03-08 22:29:38

+0

+1對於好的問題描述,樣本輸出和一些實際的代碼。祝你好運。 – shellter 2012-03-09 00:20:43

+0

@shellter非常感謝! – sid 2012-03-09 04:22:10

回答

7

下面的腳本在這裏工作。

所做的改變是有read_sub_options回報2,如果sub_menu被稱爲和選擇後退選項時返回1,然後檢查showSubMenu上次運行命令的返回值,如果返回選擇分手。

有關更多KSH腳本參考信息,請參閱KSH script basicsLearning the Korn shell

請參閱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(我是一個新手在shell中,當谷歌搜索引用使用select);但不知何故,我無法使我們的太陽unix安裝工作..反正。有時候,單調乏味的基本方法完美地工作,並且這次也是有效的! – sid 2012-03-09 04:28:16

1

外殼已經 '永遠' 的支持:

break 2 

破殼環的兩個層次。即使是第七版UNIX™Bourne shell也是如此。

0

您試圖從該函數內部的函數之外的循環中斷開。我不清楚這是否可行,但我發現它不適用於ksh93,mksh和Heirloom Bourne shell,而它可以與bash,ash(如dash和FreeBSD sh)和zsh一起使用。

您可以改爲返回一個特殊狀態,並在與循環相同的功能中斷開,如其他答案之一。