【问题标题】:How to continue in nested loops (after 2nd innerloop) in BASH?如何在 BASH 中继续嵌套循环(在第二个内循环之后)?
【发布时间】:2015-09-24 02:38:01
【问题描述】:

想请教您的意见。

我正在使用 while true、read 和 case 构建带有嵌套循环的交互式 bash 脚本。我的问题是,在第二个内部循环之后(选择“循环 1.3”时)我想用另一个内部循环继续脚本,但它失败了(部分是我关于失败的评论)。

我认为我在语法上遗漏了一些东西,但找不到...

下面是脚本的代码。 提前致谢。

#!/bin/bash
while true; do
read -rep $'Loop #1 (outerloop)? \n\tYES\tNO\n\n' yn
case $yn in
    [Yy]* )
    while true; do
    read -rep $'Loop #1.2 (first inner loop)? Please, choose variant 1 or 2.\n\t1\t2\n\n' yn
    case $yn in
    [1]* )
            while true; do
            read -rep $'Loop #1.3 (second inner loop)?\n\tYES\tNO\n\n' yn
            case $yn in
            [Yy]* ) read -rep $'Loop #1.3. Variant Yes.:\n\n' LOOP3Q1; break 3;;
            [Nn]* ) break 3;;
            esac
            done; break 3;;
    [2]* ) 
            while true; do
            read -rep $'Loop #1.3 (second inner loop).\n\tYES\tNO\n\n' yn
            case $yn in
            [Yy]* ) read -rep $'Loop #1.3 variant Yes.\n\n' LOOP3Q2; break 3;;
            [Nn]* ) break 3;;
            esac
            done; break 3;;
# Here it failes. If here I break all loops - it works, but I need to continue...
            echo "Continue loop 1.2 (first inner loop)"
            while true; do
            read -rep $'Loop #1.3 (second inner loop).\n\tYES\tNO\n\n' yn
            case $yn in
            [Yy]* ) read -rep $'Loop #1.3 variant Yes.\n\n' LOOP3Q2; break 3;;
            [Nn]* ) break 3;;
            esac
            done; break 3;
    esac
    done; break 2;;
    Nn]* ) break;;
 esac
 done

【问题讨论】:

  • 看看:shellcheck.net
  • 谢谢,实际上我去过那里,虽然它提示“您是否忘记移动 ;; 在扩展此案例项目后?” - 我不认为这是正确的,或者我看不到它......
  • 您的代码难以理解。我闻到了一个 XY 问题:忘记你的代码,告诉我们你想做什么。
  • 这个想法是让用户通过一些问题(取决于答案进入另一个问题的内循环) - 通过捕捉答案将它们用作变量来执行某些操作,我被卡住了在第二个内循环内。在我摆脱它之后,我想继续脚本并提出更多问题。我希望我设法以某种方式正确解释......

标签: bash while-loop case nested-loops interactive-shell


【解决方案1】:

break 不能跳入任意循环;该参数指定要从“堆栈”中跳出多少个循环。

【讨论】:

  • 好的,这意味着我对 bash 的要求很高。谢谢!
  • 我不知道有任何语言可以使用break。你想要的行为本质上是由goto提供的;您只需编写空循环作为目标,除非我高估了您想要的一般性。
  • continue 2 代替 break 3 只会重新启动包含当前 while 循环的循环,而不是跳转到任何特定的内部循环。
猜你喜欢
  • 2014-07-21
  • 2015-05-27
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多