循环中的Shell脚本发生了中断

5

以下是一段具有嵌套循环的shell代码,其中包含一个外部循环和一个内部循环。我想使用"break"语句来退出内部循环,但是似乎并没有起作用。请给出解决建议,在退出内部循环后显示用户第一个循环的选项。

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

在ksh手册中阅读有关select命令的内容。 - glenn jackman
对于良好的问题描述、示例输出和一些实际代码,给予加1分。祝你好运。 - shellter
@glennjackman 是的,我之前尝试过select - 我不确定为什么,但是脚本会出现错误;因此只能用繁琐的方式。 - sid
3个回答

7
以下脚本在此处有效。
进行的更改是,如果调用了“sub_menu”,则使read_sub_options返回2;当选择“返回”选项时,返回1,然后在showSubMenu中检查上次运行命令的返回值并在选择“返回”时中断。
有关KSH脚本参考信息,请参阅KSH脚本基础知识学习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

谢谢,我尝试了这种方法,完美运作;是的,我的第一种方法使用了select(我是shell方面的新手,当我谷歌搜索时,发现有些参考资料使用了select);但不知何故,在我们的sun unix系统中无法使其工作.. 不管怎样,有时候繁琐和基础的方法完美运作,这次也是如此! - sid

1

Shell一直支持以下功能:

break 2

打破两个层次的shell循环。即使是第7版UNIX™ Bourne shell也能做到。


0

你正在尝试从函数内部中断循环,但是该循环位于函数外部。我不完全确定这是否有效,但我发现在ksh93、mksh和Heirloom Bourne shell中无法正常工作,而在bash、ash(如dash和FreeBSD sh)和zsh中可以正常工作。

你可以返回一个特殊状态并在同一函数中断开循环,就像其他答案中的一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接