文章目录

  • 一、break:跳出整个循环
  • 二、continue:跳出本次循环,继续下一次循环
  • 三、exit:退出shell程序,并返回n值
  • 四、return:表示函数返回值
  • 五、区别


一、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脚本中的任意位置。