使用 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 n; do
  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 "\n"
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 "\n"
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 n; do
  if((n<1 || 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 "\n"
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 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。

 

17 shell break与continue的更多相关文章

  1. 【Shell脚本学习21】Shell break和continue命令

    在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 break 和 continue 来跳出循环. break命令 break命令允许跳出所有循环(终止 ...

  2. Shell break和continue命令

    在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 break 和 continue 来跳出循环. break命令 break命令允许跳出所有循环(终止 ...

  3. linux shell中break和continue跳出循环

    到目前为止,我们已经看到了,创建循环和使用循环来完成不同的任务.有时候,你需要停止循环或跳过循环迭代. 在本教程中,您将了解以下两个语句用于控制 Shell 循环: break 语句 continue ...

  4. Shell脚本break和continue命令

    在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用 break 和 continue 来跳出循环. break命令 允许跳出所有循环(终止执行后面的所有循环). continu ...

  5. shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、功能、select

    1.expr计算整数变量值 s=`expr 2 + 3` 运算符号和參数之间要有空格分开: 2.let命令 let s=(2+3)*4 echo $s 3.for语句 for 变量 in 列表 do ...

  6. shell中break 与 continue

    在学习中我看到不单单有break和continue的存在,还有break -n  和  continue -n 的存在  那么它们有什么区别呢. 这时可以写出测设代码: for i in a b c ...

  7. shell中跳出循环语句break和continue

    在使用while或for循环语句过程中,也许碰到某个特殊条件,我们需要跳过当次循环或整个循环,这是就需要借助break和continue. break表示跳出本层循环,break n表示跳出循环的层数 ...

  8. 3.2.2 break 与 continue 语句

    break 语句和 continue语句在while循环和for循环中都可以使用,并且一般常与选择结构结合使用.一旦break语句被执行,将使得break语句所属层次的循环提前结束.continue语 ...

  9. 自学Linux Shell12.7-控制循环break、continue命令

    点击返回 自学Linux命令行与Shell脚本之路 12.7-控制循环break.continue命令 break命令.break命令用于跳出循环,使用break可以跳出任何类型的循环:for.whi ...

随机推荐

  1. 8.10-11 mount、umount

    8.10 mount:挂载文件系统 mount命令可以将指定的文件系统挂载到指定目录(挂载点),在Linux系统下必须先挂载所有的设备,然后才能被访问,挂载其实就是为要访问的设置开个门(开门才能访问) ...

  2. 【odoo】【知识点】视图的继承逻辑

    背景:同一个模块,两组开发人员对同一个模型的form视图进行了二开.在没有指定外部ID的情况下,odoo是如何选择展示展示哪个视图呢? 上干货 odoo在加载视图的时候,首先调用的models.py中 ...

  3. JS 反射机制及 Reflect 详解

    一.什么是反射机制 反射机制是在编译阶段不知道是哪个类被加载,而是在运行的时候才加载.执行. 也就是说,反射机制指的是程序在运行时能够获取自身的信息. js 中的 apply 就是反射机制. 二.Re ...

  4. 游刃于私有网络与公共网络之间的NAT

    网络地址转化技术NAT 1. 应用场景 2. NAT 2.1 静态NAT 2.2 动态NAT 2.3 NAPT 2.4 EASY IP 3. NAT配置 3.1 静态NAT 3.2 动态NAT 3.3 ...

  5. Java常用集合笔记

    最近事情比较少,闲暇之余温习巩固一下Java的一些基础知识,并做一些笔记, Java常用集合, 主要参考的这篇文章:Java常用集合 ArrayList/Vertor 1. ArrayList 的主要 ...

  6. PageHelper--Mybatis分页插件(ssm框架下的使用)

    1.导入PageHelper依赖 <!-- MyBatis 分页插件 --> <dependency> <groupId>com.github.pagehelper ...

  7. AgileConfig轻量级配置中心1.3.0发布,支持多用户权限控制

    AgileConfig 当初是设计给我自己用的一个工具,所以只设置了一道管理员密码,没有用户的概念.但是很多同学在使用过后都提出了需要多用户支持的建议.整个团队或者整个公司都使用同一个密码来管理非常的 ...

  8. 【逆向实战】ES文件浏览器未授权访问漏洞(CVE-2019-6447)具体分析及利用

    /作者:Kali_MG1937 CSDN博客号:ALDYS4 QQ:3496925334 未经许可,禁止转载/ 漏洞简介 CVE-2019-6447是Android端上的一个知名软件:ES文件浏览器的 ...

  9. 【NX二次开发】Block UI 线宽

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  10. Linux CentOS 配置Yaf框架

    简介 Yaf框架想必大家都有所了解,它是一个开源的高性能的PHP框架 官网地址:https://www.php.net/manual/zh/book.yaf.php Yaf开发文档:https://w ...