zoukankan      html  css  js  c++  java
  • 17 shell break与continue

    使用 while、until、for、select 循环时,如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用 break 或者 continue 关键字

    在C语言、Python、Java 等大部分编程语言中,break 和 continue 只能跳出当前层次的循环,内层循环中的 break 和 continue 对外层循环不起作用;但是 Shell 中的 break 和 continue 却能够跳出多层循环,内层循环中的 break 和 continue 能够跳出外层循环。在实际开发中,break 和 continue 一般只用来跳出当前层次的循环,很少有需要跳出多层循环的情况。

    break 关键字

    Shell break 关键字的用法为:break n

    n 表示跳出循环的层数,如果省略 n,则表示跳出当前的整个循环。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。

    举栗:

    需求
    脚本
    运行结果
    从终端不断获取正数并求和,当获取到非正数时,跳出循环

    #!/bin/bash
    sum=0
    while read ndo
      if((n>0)); then
        ((sum+=n))
      else
        break
      fi
    done
    echo "sum=$sum"

    10↙
    20↙
    30↙
    0↙

    sum=60

    while 循环通过 read 命令的退出状态来判断循环条件是否成立

    只有当按下 Ctrl+D 组合键(表示输入结束)时,read n才会判断失败,此时 while 循环终止。

    输入一个小于等于零的整数或者字符时,使用break可以跳出当前循环

    使用两个break分别跳出内外两个循环,输出一个 4*4 的矩阵

    #!/bin/bash
    i=0

    while ((++i)); do #外层循环
      if((i>4)); then
        break#跳出外层循环
      fi

      j=0;
      while ((++j)); do #内层循环
        if((j>4)); then
          break#跳出内层循环
        fi
        printf "%-4d" $((i*j))
      done
    printf " "
    done

    1   2   3   4   
    2   4   6   8   
    3   6   9   12  
    4   8   12  16

    1.while ((++i))首次执行时会先将i由0加为1,如果使用while ((i++))首次执行时i为0,

    则while条件会失败,什么都不会输出使用

    2.printf "%-4d" $((i*j))设置输出字符占4位

    3.当 j>4 成立时,执行第二个 break,跳出内层循环;

    外层循环依然执行,直到 i>4 成立,跳出外层循环。内层循环共执行了 4 次,外层循环共执行了 1 次。

    在 break 后面跟一个数字,让它一次性地跳出多层循环

    #!/bin/bash
    i=0

    while ((++i)); do #外层循环
      j=0;
      while ((++j)); do #内层循环
        if((i>4)); then
          break#跳出外层循环
        fi  

        if((j>4)); then
          break 2#跳出内外两层循环
        fi
        printf "%-4d" $((i*j))

      done
      printf " "
    done

    1   2   3   4

    当第一次j>4满足条件时,执行break 2,跳出两层循环,所以只会打印一行数据

    测试过程中发现:

     
    返回码 $?
    $i

    i=0  ((i++))

    1 1

    i=0  ((++i))

    0 1

    i=1  ((i++))

    0 2

    i=1   ((++i))

    0 2
     
    break 跳出当前循环
    #!/bin/sh
    a=0
     
    while [ $a -lt 10 ];do
      echo $a
      if [ $a -eq 3 ];then
        break
      fi
      a=`expr $a + 1`
    done
     
    结果:
    0
    1
    2
    3
     
    break 跳出两层循环
    #!/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

    continue 关键字

    Shell continue 关键字的用法为:continue n

    n 表示循环的层数:

    • 如果省略 n,则表示 continue 只对当前层次的循环语句有效,遇到 continue 会跳过本次循环,忽略本次循环的剩余代码,直接进入下一次循环。
    • 如果带上 n,比如 n 的值为 2,那么 continue 对内层和外层循环语句都有效,不但内层会跳过本次循环,外层也会跳过本次循环,其效果相当于内层循环和外层循环同时执行了不带 n 的 continue。

    continue 关键字也通常和 if 语句一起使用,即满足条件时便跳出循环。 

    举栗

    需求
    脚本
    运行结果
    不断从终端读取用户输入的 100 以内的正数,求它们的和

    #!/bin/bash
    sum=0

    while read ndo
      if((n<|| n>100)); then
        continue
      fi

      ((sum+=n))
    done

    echo "sum=$sum"

    10↙
    20↙
    -1000↙
    5↙
    9999↙
    25↙
    sum=60

    1.if条件也可使用if [[ $n -lt 1 || $n -gt 100 ]]

    2.当输入为 -1000 和 9999时,因为输入值不在 1~100 的范围内,if 判断条件成立,

    执行了continue 语句跳过了当次循环,也就是跳过了((sum+=n))这条语句。

    3.只有按下 Ctrl+D 组合键输入才会束,read n才会判断失败,while 循环才会终止。

    使用 continue 跳出多层循环

    #!/bin/bash

    for((i=1; i<=5; i++)); do
      for((j=1; j<=5; j++)); do
        if((i*j==12)); then
          continue 2
        fi
        printf "%d*%d=%-4d" $i $j $((i*j))
      done
      printf " "
    done

    1*1=1   1*2=2   1*3=3   1*4=4   1*5=5   #换行

    2*1=2   2*2=4   2*3=6   2*4=8   2*5=10  #换行

    3*1=3   3*2=6   3*3=9   4*1=4   4*2=8   5*1=5   5*2=10  5*3=15  5*4=20  5*5=25

    1.从运行结果可以看出,当满足条件continue 2时,跳过了该次循环后续的命令,

    所以在i=3或4时没有换行。

    2.for循环的循环体仍用do done包括,for 条件用(())包括,其中的表达式用分号分割

     continue 跳过当前循环
     
    #!/bin/sh
    NUMS="1 2 3 4 5 6 7"
     
    for NUM in $NUMS;do
      Q=`expr $NUM % 2`
      if [ $Q -eq 0 ];then
        echo "Number is an even number!!"
        continue
      fi
      echo "Found odd number"
    done
     
    结果:
    Found odd number
    Number is an even number!!
    Found odd number
    Number is an even number!!
    Found odd number
    Number is an even number!!
    Found odd number

    break 和 continue 的区别

    break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。

     
  • 相关阅读:
    Spring Tool Suite 配置和使用
    自动提示在线/离线状态
    Excel数据导入数据库的SQL快速生成
    MySQL查询和删除重复数据
    内存不足时,调用ajax报的错
    订单支付成功后存储过程
    下订单存储过程
    课程表,订单表(统计报名人数),评论表(统计评论的人数),点赞表(点赞人数)
    更改浏览器的滚动条样式
    自定义文本选中样式
  • 原文地址:https://www.cnblogs.com/mianbaoshu/p/12069657.html
Copyright © 2011-2022 走看看