十四、循环控制
break n 省略n,表示跳出整个循环;n表示跳出循环的层数 continue n 省略n,表示跳过本次循环,忽略本次循环的剩余代码,进入下一次的循环;n表示退出到第n层循环 exit n 退出当前shell程序,n为上一次程序执行的状态返回值。n也可以省略,在下一个shell里可通过"$?"接收exit n的n值 return n 用于将函数中作为函数的返回值,以判断函数执行是否正确。在下一个shell里可通过"$?"接收exit n的n值
1、break
三、循环控制测试
该案例来自于《跟老男孩学Linux运维:shell编程实战》
#!/bin/bash if [ $# -ne 1 ];then #<==如果传参个数不为1,则打印下面的使用提示给用户。 echo $"usage:$0 break|continue|exit|return" #<==分别传入4个命令作为参数。 exit 1 #<==退出脚本。 fi test(){ #<==定义测试函数。 for((i=0; i<=5; i++)) do if [ $i -eq 3 ] ;then $*; #<==这个地方的“$*”就是接收函数外的参数,将来就是 break|continue|exit|return中的一个。 fi echo $i done echo "I am in func." #<==循环外的输出提示。 } test $* #<==这里的“$*”为函数的传参。 func_ret=$? #<==接收并测试函数返回值。 if [ `echo $*|grep return|wc -l` -eq 1 ] #<==如果传参有return。 then echo "return's exit status:$func_ret" #<==则提示return退出状态。 fi echo "ok" #<==函数外的输出提示。
[root@node1 scripts]# bash xunhuankongzhi.sh break 0 1 2 I am in func. #循环外的结果 ok #函数外的结果 #根据结果可以看到,i等于3及以后的循环没有被执行,但循环外的echo执行了,执行到break时跳出了if及外层的for循环语句,然后执行for循环外部done后面的打印ok的语句。
[root@node1 scripts]# bash xunhuankongzhi.sh continue 0 1 2 #没有打印3 4 5 I am in func. #循环外的结果 ok #函数外的结果 #可以看到,只有i等于3这层循环没有被执行,其他循环全部执行了,循环外的echo也执行了,说明执行到continue时,终止了本次循环,而继续下一次的循环,直到循环正常结束,接着继续执行了循环外面的所有语句。
[root@node1 scripts]# bash xunhuankongzhi.sh "exit 119" #"exit 119"双引号括起来表示一个参数 0 1 2 #当i=3时就退出了脚本,不在执行脚本以后的任何代码 [root@node1 scripts]# echo $? 119 #返回了脚本执行的状态值为119 #根据执行结果可以看到,当进入test函数循环里的if语句后遇到"exit 119"时,立刻退出程序,不但循环体3后面的数字没有输出,而且for循环体done外的echo和函数外的ok也没有输出,就直接退出了程序。另外,因为程序退出时指定了119,所以执行脚本后获取"$?"的返回值时就返回了"exit 119"后面的119这个数字到当前的Shell。
[root@node1 scripts]# bash xunhuankongzhi.sh "return 119" 0 1 2 return's exit status:119 #把119返回给了函数外部的脚本 ok [root@node1 scripts]# echo $? 0 #当进入test函数循环里的if语句后遇到return 119,就没有打印3以下的数字,说明return跳出了循环体,程序也没有执行for循环体done外的echo命令,而是直接执行了函数test外的if语句及打印ok的命令,可见return的作用是退出当前函数。同时,return将数字119作为函数的执行状态值返还给函数体外,执行脚本后打印返回值是0,因为程序的最后一行是打印ok的命令,执行是成功的。
I have a dream so I study hard!!!