我们继续将bash脚本编程,回顾一下程序的执行流程,分别为:
顺序执行 选择执行 循环执行
而对于循环执行来说,其分类涉及到以下几种:
for, while, until
每个循环都有执行条件和退出条件,这样的话才能够执行该循环,而且一旦进入之后也不能够无限期的循环,所以还要有退出条件,将循环结果用于其它代码进行计算执行,而各个分类的进入循环和退出循环的条件是有所区别的。
进入条件: for:列表元素非空; while:条件测试结果为"真"; until:条件测试结果为"假"; 退出条件: for:列表元素遍历完成; while:条件测试结果为"假"; until:条件测试结果为"真";
一、循环控制语句
1.1 contunue语句
我们今天来讲一下循环的另一个知识点,叫做循环控制语句,对于for循环来说,如果进入执行条件的话,列表元素不是空的就可以了,而退出条件是条件列表中的元素遍历完成则退出循环,而每一次的开始循环,都是在执行循环体中的代码,循环体执行结束时则开始下一轮的循环,直到退出该循环。但循环控制语句可以改变其默认的行为,那么循环控制语句就是在循环体当中用来控制循环执行行为的这么一个语句,它能够实现本来这一轮循环完成的时候,它能够提前能够进入下一轮循环,例如在循环体当中有十个语句,执行到第五个的时候停止执行该循环体,转而重新进入下一轮测试,而这个控制我们需要使用contunue
。
循环控制语句: contunue:提前结束本轮循环,而直接进入下一轮循环判断;
以while循环为例,那么该控制语句的使用用法:
while CONDITION1; do COM1 ... if CONDITION2; then continue fi CMDn ... done
执行continue之后,COMDn之后的语句都不会在执行,因此,该循环则结束,它用于在循环体语句当中的中间的某一个位置。
1.2 break语句
break
的作用不是结束本轮循环,而是直接跳出并结束循环,它的用法和continue语句的格式一样。
break:提前跳出循环; while CONDITION1; do COMD1 ... if CONDITION2; then break fi CMDn ... done
和continue语句所不同的是,break可以在任何一个位置上出现。
当然在使用break语句之前,我们先说一下如何创建死循环,如果说我们不知道要循环多少次的时候,这个时候我们就需要创建一个永久能够符合条件的循环在运行,但一直死循环会造成对系统资源增加负担,我们可以让死循环每隔多长时间运行一次,使用sleep
命令能够缓解bash循环对进程可以进行睡眠,而创建格式为:
创建死循环: while true; do 循环体 done
而sleep命令的用法为:
sleep命令: sleep - delay for a specified amount of time sleep NUMBER
由于没有退出条件,所以这是死循环,但我们不能看着它一直循环下去,我们必须得让它满足某个条件时必须让其退出该循环去执行其它指令,那么它的退出方式为当某个条件满足时,可让循环体去执行break命令。
退出方式: 某个测试条件满足时,让循环体执行break命令;
示例:每隔3秒钟系统以上获取已经登录用户的信息;其中,如果logstash用户登录了系统,则记录于日志中,并退出;
#!/bin/bash # while true; do if who | grep "^li\>" &> /dev/null; then echo "user li login." break fi sleep 3 echo "user li not login." done echo "$(date +"%F %T") li logged on." >> /tmp/user.log
二、循环的特殊用法
2.1 while循环的特殊用法
while循环的特殊用法就是用来去遍历文件,当然这个遍历是遍历文件的行,假如说要去遍历该文件的每一行时,使用该机制是一个不错的选择,比如说我们取得ID号为偶数的用户名,以及shell和用户id。对于这个示例来讲,我们的特殊用法使用的是read
关键字,在这里不用和用户交互,后面跟上一个变量开始循环,使用输入重定向来指定文件路径。
while循环的特殊用法(遍历文件的行): while read VARIABLE; do 循环体 done < /PATH/FROM/SOMEFILE
它所实现的功能为:
依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将其赋值给VARIABLE变量;
示例:找出ID号为偶数的用户,显示其用户名、ID、及默认shell;
#!/bin/bash # while read line; do username=`echo $line | cut -d: -f1` userid=`echo $line | cut -d: -f3` usershell=`echo $line | cut -d: -f7` if [ $[$userid%2] -eq 0 ]; then echo "$username, $userid, $usershell" fi done < /etc/passwd
2.2 for循环的特殊用法
for
循环的特殊用法和while的循环遍历也是一样的,其该用法为:
for循环的特殊用法: for ((控制变量初始化;条件判断表达式;控制变量的修正语句));do 循环体 done
对于括号里的条件来说,作为控制变量初始化,是仅在循环代码开始运行时只执行一次,而在控制变量的修正表达式是在每轮循环结束会先控制遍历修正运算,而后在做条件判断。
控制变量初始化:仅在循环代码开始运行时执行一次; 控制变量的修正语句:每轮循环结束会先进行控制遍历修正运算,而后在做条件判断;
示例:求100以内所有正整数之和;
#!/bin/bash # declare -i sum=0 for ((i=1;i<=100;i++)); do let sum+=$i done echo "Sum: $sum"