2012-03-08 29 views
5

Có vỏ sau, có vòng lặp (trong khi đúng) bên trong vòng lặp (trong khi thực). Tôi đang cố gắng để phá vỡ vòng lặp bên trong bằng cách sử dụng một "break" nhưng nó không phải là. Tôi muốn ngắt vòng lặp bên trong & hiển thị cho người dùng các tùy chọn của vòng lặp thứ nhất; đề xuất xin.Vòng ngắt trong khi ngắt thực sự

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

Đây là kết quả:

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

Đọc về lệnh 'select' trong trang manpage ksh. –

+0

+1 cho mô tả sự cố tốt, đầu ra mẫu VÀ một số mã thực tế. Chúc may mắn. – shellter

+0

@shellter cảm ơn nhiều! – sid

Trả lời

7

Các kịch bản sau đây làm việc ở đây.

Các thay đổi được thực hiện để có read_sub_options trả lại 2 nếu sub_menu được gọi và trả về 1 khi tùy chọn Quay lại được chọn và sau đó kiểm tra giá trị trả về của lệnh chạy cuối cùng trong showSubMenu và ngắt nếu Back được chọn.

Xem KSH script basicsLearning the Korn shell để biết thêm thông tin tham chiếu tập lệnh KSH.

Xem select và trang người dùng ksh để biết thông tin về một phương pháp lựa chọn menu thay thế được đề cập trong nhận xét về câu hỏi của bạn.

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

cảm ơn tôi đã thử cách tiếp cận này hoạt động hoàn hảo; và có cách tiếp cận đầu tiên của tôi đã được sử dụng lựa chọn (tôi là một người mới trong vỏ, và khi googled tôi đã tham khảo bằng cách sử dụng chọn); nhưng bằng cách nào đó tôi đã không thể thực hiện công việc đó trên bản cài đặt Unix của chúng tôi .. dù sao đi nữa. Đôi khi các cách tiếp cận tẻ nhạt và cơ bản hoạt động hoàn hảo và hoạt động trong thời gian này !!! – sid

1

Vỏ đã 'always' hỗ trợ:

break 2 

để phá vỡ hai cấp độ của vòng vỏ. Ngay cả phiên bản 7 của UNIX ™ Bourne cũng đã làm điều đó.

0

Bạn đang cố thoát khỏi vòng lặp bên ngoài một hàm từ bên trong hàm đó. Nó không phải là hoàn toàn rõ ràng với tôi cho dù điều này nên làm việc, nhưng tôi đã thấy rằng nó không hoạt động với ksh93, mksh và vỏ Heirloom Bourne, trong khi nó làm việc với bash, tro (như dash và FreeBSD sh) và zsh.

Bạn có thể trả lại trạng thái đặc biệt thay vào đó và phá vỡ chức năng tương tự như vòng lặp, như trong một trong các câu trả lời khác.

Các vấn đề liên quan