在bash中跳出嵌套循环

11

如何在bash中跳出嵌套循环?

尝试了continuebreakbreak可以正常工作。但想要学习更多。

for i in 1 2 3; do 
  if [[ $flag -eq 1 ]]; then
    break
  fi
done

break如何判断循环是否嵌套?可以使用i=4或越界等方法退出循环吗?


10
"If"语句并不是一个循环,所以在你的例子中并没有嵌套的循环。 - dtrckd
1
与大多数其他语言一样,Bash 跟踪所有语句的词法作用域。在解释 if 语句时,Bash 已经注意到它是循环的一部分。这就是 break 语句知道该做什么的原因。 - that other guy
1个回答

27

使用break后跟一个数字,可以跳出该数字级别的嵌套循环。例如:

for i in 1 2 3 4 5; do
    echo
    echo i = $i
    for j in 1 2 3 4 5; do
        echo j = $j
        if [ $j -eq 4 ]; then break; fi
        if [ $j -eq 3 ] && [ $i -eq 4 ]; then break 2; fi
    done
done

结果:

i = 1
j = 1
j = 2
j = 3
j = 4

i = 2
j = 1
j = 2
j = 3
j = 4

i = 3
j = 1
j = 2
j = 3
j = 4

i = 4
j = 1
j = 2
j = 3

在你的例子中,有2个for循环。if循环是否计数用于break?break的默认数字是1吗? - hithesh
1
@hithesh 当有人回复了你的评论后,请不要更改它,以免改变回复的意思。无论如何,if语句不是循环,因此不计入其中,而且默认值为1。 - Joseph Sible-Reinstate Monica
由于答案编辑队列已满,让我们使用评论部分。break --help也应该说明相关信息。值得一提的是,break将立即结束所有指定的循环深度。换句话说,指定的循环不会通过直到其块结束,但会立即停止执行。"break"的行为取决于Bash版本(例如,如果在其父shell中达到,则"break"将导致subshell退出),更多信息应该在"Compatibility"详细文档中提供:http://tiswww.case.edu/php/chet/bash/COMPAT - Artfaith

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