【问题标题】:Shell break while-true loopShell 中断 while-true 循环
【发布时间】:2012-03-26 09:37:01
【问题描述】:

有以下外壳,它在 (while true) 循环内有一个 (while true) 循环。我正在尝试使用“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 命令。
  • +1 以获得良好的问题描述、示例输出和一些实际代码。祝你好运。
  • @glennjackman 是的,我之前确实尝试过 select - 我不知道为什么,但是脚本会如何中断;因此是乏味的方式。

标签: shell while-loop


【解决方案1】:

您正试图从该函数内部中断该函数外部的循环。我并不完全清楚这是否应该起作用,但我发现它不适用于 ksh93、mksh 和 Heirloom Bourne shell,而它适用于 bash、ash(例如 dash 和 FreeBSD sh)和 zsh。

您可以改为返回一个特殊状态,并在与循环相同的函数中中断,就像在其他答案之一中一样。

【讨论】:

    【解决方案2】:

    外壳“始终”支持:

    break 2
    

    打破两层shell循环。甚至第 7 版 UNIX™ Bourne shell 也能做到这一点。

    【讨论】:

      【解决方案3】:

      下面的脚本在这里工作。

      所做的更改是让read_sub_options 在调用sub_menu 时返回 2,并在选择 Back 选项时返回 1,然后检查 showSubMenu 中最后一个运行命令的返回值,如果选择了 Back,则中断。

      有关更多 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
      

      【讨论】:

      • 谢谢我试过这个方法很完美;是的,我的第一种方法是使用 select(我是 shell 的新手,当我用谷歌搜索时,我使用 select 获得了参考);但不知何故,我无法在我们的 sun unix 安装上完成这项工作.. 无论如何。有时繁琐而基本的方法可以完美运行,这次也可以使用!!!
      猜你喜欢
      • 2016-12-03
      • 2012-07-13
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 2016-07-11
      • 1970-01-01
      相关资源
      最近更新 更多