一、break:跳出整个循环
- 原理示意图
- 详解:
break n
n 表示跳出循环的层数,如果省略 n,则表示跳出当前的整个循环。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。
- 实例演示
如果 break 后面不跟数字的话,表示跳出当前循环,对于有两层嵌套的循环,就得使用两个 break 关键字。例如,输出一个 4*4 的矩阵:
$ cat 1.sh
#!/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
$ sh 1.sh
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
当 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 2 #跳出内外两层循环
fi
if((j>4)); then
break #跳出内层循环
fi
printf "%-4d" $((i*j))
done
printf "\n"
done
修改后的代码将所有 break 都移到了内层循环里面。读者需要重点关注break 2这条语句,它使得程序可以一次性跳出两层循环,也就是先跳出内层循环,再跳出外层循环。
二、continue:跳出本次循环,继续下一次循环
- 原理示意图
- 详解:
continue n
n 表示循环的层数:
如果省略 n,则表示 continue 只对当前层次的循环语句有效,遇到 continue 会跳过本次循环,忽略本次循环的剩余代码,直接进入下一次循环。
如果带上 n,比如 n 的值为 2,那么 continue 对内层和外层循环语句都有效,不但内层会跳过本次循环,外层也会跳过本次循环,其效果相当于内层循环和外层循环同时执行了不带 n 的 continue。这么说可能有点难以理解,稍后我们通过代码来演示。
- 实例演示
使用 continue 跳出多层循环,请看下面的代码:
$ cat 1.sh
#!/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
$ sh 1.sh
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
从运行结果可以看出,遇到continue 2时,不但跳过了内层 for 循环,也跳过了外层 for 循环。
三、exit:退出shell程序,并返回n值
exit 是一个 Shell 内置命令,用来退出当前 Shell 进程,并返回一个退出状态;使用$?可以接收这个退出状态;
exit 命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0。
一般情况下,退出状态为 0 表示成功,退出状态为非 0 表示执行失败(出错)了。
exit 退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。
Shell 进程执行出错时,可以根据退出状态来判断具体出现了什么错误,比如打开一个文件时,我们可以指定 1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。
编写下面的脚本,并命名为 test.sh:
#!/bin/bash
echo "befor exit"
exit 8
echo "after exit"
运行该脚本:
[mozhiyan@localhost ~]$ bash ./test.sh
befor exit
可以看到,"after exit"并没有输出,这说明遇到 exit 命令后,test.sh 执行就结束了。
四、return:表示函数返回值
【注意】retrun 命令不能直接用在脚本的主程序里
-
主要用途:
使得shell函数退出并返回数值,如果没有指定 n 的值,则默认为函数最后一条命令执行的返回状态。
-
返回值:
返回值为你指定的参数n的值,如果你指定的参数大于255或小于0,那么会通过加或减256的方式使得返回值总是处于0到255之间。
在函数外执行return语句会返回失败。实例演示:
#!/usr/bin/env bash # 定义一个返回值大于255的函数 example() { return 259 } # 执行函数 example # 显示3 (259-256=3) echo $?
五、区别
-
break 与 continue 的区别
1、break 用来结束所有循环,循环语句不再有执行的机会;
2、continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
-
return 与 exit 的区别:
1、exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程。而return是返回函数值并退出函数
2、return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。
3、使用方法不用。return一般用在函数方法体内,exit可以出现在Shell脚本中的任意位置。