上篇咱们学习了shell中条件选择语句的用法。接下来本篇就来学习循环语句。在shell中,循环是经过for, while, until命令来实现的。下面就分别来看看吧。java
for循环有两种形式:shell
基本格式以下:编程
for var in list do commands done
list表明要循环的值,在每次循环的时候,会把当前的值赋值给var(变量名而已,随意定), 这样在循环体中就能够直接经过$var获取当前值了。bash
先来一个例子吧:编程语言
#!/bin/bash for str in a b c d e do echo $str done
以上会根据空格将abcde分割,而后依次输出出来。学习
若是以上例子不是以空格分割,而是以逗号(,)分割呢?code
#!/bin/bash list="a,b,c,d,e" for str in $list do echo $str done
结果输出a,b,c,d,eget
形成这个结果的缘由是:for...in循环默认是循环一组经过空格或制表符(tab键)或换行符(Enter键)分割的值。这个实际上是由内部字段分隔符配置的,它是由系统环境变量IFS定义的。固然,既然是由环境变量定义的,那固然也就能修改啊。博客
#!/bin/bash #定义一个变量oldIFS保存未修改前的IFS的值 oldIFS=$IFS #修改IFS值,以逗号为分隔符 IFS=$',' list=a,b,c,d,e list2="a b c d e" for var in $list do echo $var done for var2 in $list2 do echo $var2 done #还原IFS的值 IFS=$oldIFS
以上第一个循环会分别输出abcde几个值。而第二个循环会输出a b c d e(即未处理)。由于咱们把IFS的值设置为逗号了, 固然,不必定要是逗号,想设置什么,你说了算!it
bash中c语言风格的for循环遵循以下格式:
for (( variable assignment ; condition ; iteration process ))
一个例子足以说明:
#!/bin/bash for (( i = 0; i <= 10; i++ )) do echo $i done
上面例子循环11次,从0到10依次输出。稍微有过编程基础的都对此应该很熟悉。就不作详细阐述了。
若是你习惯了其它语言的while循环,那么到这儿你又会发现这个while循环有点变态了。与其它编程语言while的不一样在于:在bash中的while语句,看起来彷佛是结合了if-then语句(参考上一篇)和for循环语句。其基本格式以下:
while test command do other commands done
与if-then语句同样,后面接test命令,若是test后面的命令的退出状态码为0. 那么就进入循环,执行do后面的逻辑。要注意在do后面的逻辑中写条件,避免死循环。
既然是接test命令,那么一切均可以参考if-then的test
示例一:
#!/bin/bash flag=0 while test $flag -le 10 do echo $flag # 若是没有这句,那么flag的值一直为0,就会无限循环执行 flag=$[$flag + 1] done
以上判断flag是否大于或者等于10, 若是知足条件,那么输出当前flag的值,而后再将flag的值加1。最终输出的结果为0到10的结果。
结合上一篇文章test的写法,咱们还能够将以上示例变形为以下:
示例二:
#!/bin/bash flag=0 while [ $flag -le 10 ] do echo $flag flag=$[$flag + 1] done
示例三:
flag=0 while (( $flag <= 10 )) do echo $flag flag=$[$flag + 1] done
until语句基本格式以下:
until test commands do other commands done
在掌握while循环语句以后, until语句就很简单了。until语句就是与while语句刚好相反, while语句是在test命令退出状态码为0的时候执行循环, 而until语句是在test命令退出状态码不为0的时候执行。
示例:
#!/bin/bash flag=0 until (( $flag > 10 )) do echo $flag flag=$[ $flag + 1 ] done
以上输出0到10的值。until后面的条件与上面while例子彻底相反。
好啦,到此,咱们学完了shell的循环语句啦。不过上面咱们写的循环语句都是根据条件执行完毕,若是咱们在执行的过程当中想退出,该怎么办?接下来就继续看看怎么控制循环语句。
与其它编程语言同样,shell是经过break和continue命令来控制循环的。下面就分别来看看两者的基本用法:
示例一:
#!/bin/bash for (( flag=0; flag <= 10; flag++ )) do if (( $flag == 5 )) then break fi echo $flag done
以上当flag的值为5的时候,退出循环。输出结果为0-4的值。
示例二:
#!/bin/bash flag=0 while (( $flag < 10 )) do for (( innerFlag=0; innerFlag < 5; innerFlag++ )) do if (( $innerFlag == 2 )) then break fi echo "innerFlag=$innerFlag" done echo "outerFlag=$flag" done
以上代码在执行内部循环for的时候,当innerFlag值为2的时候就会跳出到外层的while循环, 因为外层循环一直flag都为0, 因此while会成为一个死循环,不停的输出:
...
innerFlag=0
innerFlag=1
outerFlag=0
...
break 可后接数字,用于表示退出当前循环的外层的第几层循环。
示例三:
#!/bin/bash flag=0 while (( $flag < 10 )) do for (( innerFlag=0; innerFlag < 5; innerFlag++ )) do if (( $innerFlag == 2 )) then # 2表示外面一层循环 break 2 fi echo "innerFlag=$innerFlag" done echo "outerFlag=$flag" done
与上面例子相比,本例就只是在break后面跟了个数字2,表示退出外面的第一层循环。最终输出:
innerFlag=0
innerFlag=1
continue表示终止当前的一次循环,进入下一次循环,注意,continue后面的语句不会执行。
continue的语法与break同样,所以,就只作一个示例演示啦。
示例:
flag=0 while (( $flag <= 10 )) do if (( $flag == 5 )) then flag=$[$flag+1] continue fi echo "outerFlag=$flag" for (( innerFlag=11; innerFlag < 20; innerFlag++ )) do if (( $innerFlag == 16 )) then flag=$[$flag+1] continue 2 fi echo "innerFlag=$innerFlag" done done
以上例子: 当for循环中innerFlag的值为16的时候会跳到外层while循环,当外层循环的flag的值为5的时候,会直接跳过本次循环,而后进入下一次循环,所以在输出的结果中,不会出现outerFlag=5的状况。
个人博客www.javafan.cn