我不明白 break 命令

I do not understand the break command

在:

#!/bin/sh

for var1 in 1 2 3
do
   for var2 in 0 5
   do
      if [ $var1 -eq 2 -a $var2 -eq 0 ]
      then
         break 2
      else
         echo "$var1 $var2"
      fi
   done
done

输出为:

1 0
1 5

然后脚本停止。

如果删除 break 命令的参数 (2),输出是:

1 0
1 5
3 0
3 5

我想问的是,为什么要打印 3 03 5,当脚本被设置为不中断时?脚本没有打印 2 02 53 03 5 也应该发出中断信号...

只是一个简单的 break 跳出一个循环 - 在您的例子中是内部 for 循环。 但是,如果您在 break 语句中使用额外的整数,如 break 2,则跳出指定的循环次数 - 在您的例子中,即 two for 循环。由于嵌套循环不超过两个,并且最外层循环之后没有更多代码,因此实际上与结束脚本相同。

break 的可选参数告诉它要跳出哪个循环。如果省略参数,它会跳出最内层的循环。使用参数 n 它会跳出第 n 个封闭循环。

所以 break 2 跳出 for var1 循环,因为它是第二个封闭循环。如果将其更改为 break,它会跳出 for var2 循环,因此它会进入 for var1.

的下一个迭代

总结评论,有两个问题:

  • 为什么 3 0break 之后打印,而不是在 break 2 之后打印?

这是因为条件 ([ $var1 -eq 2 -a $var2 -eq 0 ]) 检查是否相等,而不是 -ge,大于或等于。使用 -ge 时,不会有 echo 两个数字都更大的地方。

break 2 反而退出了两个循环,从而在这种特殊情况下产生相同的效果。如果循环是 for var1 in 1 2 0break 2 也会阻止 0 0 出现,因为两个循环都会停止。

  • 为什么在 brake 之后不打印 2 5

这是因为整个内部循环在 break 处停止,所以其他迭代都没有机会 echo。要跳过当前迭代并立即尝试下一个迭代,请使用 continue