一、while循环语句
1.1.语法结构
(1)格式
(2)案列
1.2.while死循环
(1)格式
(2)案例
二、until循环
(1)语法结构
补充:死循环结构
(2)案例
三、循环控制语句
3.1.continue
3.2.break
3.3.exit
一、while循环语句
1.1.语法结构 (1)格式
while 表达式do commanddone
(2)案列
例1:打印1-5。
#!/bin/bashi=1while [ $i -le 5 ]do echo $i let i++ //注意这里如果不改变$i的值,会变成死循环# i=$[$i+1] //两种写法doneecho "最后i的值为: $i"
例2:输出1-100之间不能被3整除的数字。
#!/bin/bashi=1while [ $i -le 100 ]do if [[ $i%3 -ne 0 ]] then echo "$i" fi let i++done
例3:打印1-100的和。
#!/bin/bashi=1sum=0while [ $i -le 100 ]do let sum=$i+$sum let i++doneecho $sum
例4:监控某服务(httpd)运行状态。
while ps aux | grep httpd | grep -v grep &> /dev/nulldoecho "httpd 正在运行中"sleep 2doneecho "httpd 不在运行"
1.2.while死循环 (1)格式
①:while [ 1 -eq 1 ] //写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去do commanddone②:while truedo commanddone③:while :do commanddone
(2)案例
例1:猜数字,猜不对就一直猜。
#!/bin/bashnum=10while truedoread -p "请输入数字:" shuif [ $shu -eq $num ];then echo "你猜对了" breakelif [ $shu -gt $num ];then echo "你猜大了"elif [ $shu -lt $num ];then echo "你猜小了"fidone
例2:批量添加规律编号的用户。
#!/bin/bashUSERS="stu"i=1while [ $i -le 20 ] douseradd ${USERS}$iecho "123456" | passwd --stdin ${USERS}$i &> /dev/null let i++done
例3:猜商品价格游戏。
$random用于生成0—32767的随机数
第一种方法:
#!/bin/bashPRICE=$(expr $RANDOM % 1000)a=0echo "商品实际价格范围为 0-999,猜猜看是多少?" while truedoread -p "请输入你猜测的价格数目:" n let a++if [ $n -eq $PRICE ] ; thenecho "恭喜你答对了,实际价格是 $PRICE" echo "你总共猜测了 $a 次"exit 0elif [ $n -gt $PRICE ] ; then echo "你猜高了!"elseecho "你猜低了!"fi done
第二种方法:
#!/bin/bashsorce=$[$RANDOM % 1000]a=1num=0while[ $a -lt 2 ]doread -p "请输入你猜的价格(1-999之 间) :" priceif [ $price -eq $sorce ] ; thenecho "恭喜你猜对了!"let num++let a++elif [ $price -gt $sorce ] ; thenecho "你猜高了!"let num++elif[ $price -lt $sorce ] ; thenecho "你猜小了!"let num++fidoneecho "你一共猜了$num次!"
例4:实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M 时,发送报警邮件给 root 管理员。
#!/bin/bash#提取根分区剩余空间disk_size=$(df / |awk '///{print $4}')#提取内存剩余空间mem_size=$(free |awk '/Mem/{print $4}') while :do#注意内存和磁盘提取的空间大小都是以Kb 为单位if [ $disk_size ‐le 512000 -a $mem_size ‐le 1024000 ];then mail ‐s Warning root <
二、until循环
跟while相反,条件为假进入循环,条件为真退出循环。
(1)语法结构
until 表达式do commanddone
补充:死循环结构
①:until falsedo commanddone②:until [ 1 -ne 1 ]do commanddone
(2)案例例1:计算1-50的和1275两种写法。
第一种:
#!/bin/bashi=0;s=0until [ $i -eq 51 ] dolet s+=i #s+=i,等价于s=s+i,使用加赋值let i++ doneecho $s
第二种:
vim 50.sh#!/bin/bashi=1sum=0until [ $i -eq 51 ] //这里注意如果是50的话条件为真循环结束它计算的是1-49的和,until [ $i -gt 50 ]也行 do sum=$[$i+$sum] let i++ doneecho "$sum"
例2:登录zhangsan用户 使用root 发消息个zhangsan。
#!/bin/bashusername=$1#判断信息格式if [ $# -lt 1 ];then echo "Usage:`basename $0`
三、循环控制语句
for循环一般会搭配条件判断语句和流程控制语句一起执行,那么就会出现需要跳过循环和中止循环的情况,控制循环的命令有以下3个。
3.1.continue
继续,但不会执行循环体内下面的代码了,开始重新开始下一次循环。
例:打印1-5的数字,3不打印。
[root@server ~]# vim for4.sh#!/bin/bashfor ((i=1;i<=5;i++))do if [ $i -eq 3 ];then continue else echo $i fidone
结果是1245,3不输出,因为跳出后面的echo语句执行下一次循环了。
3.2.break
打断,马上停止本次循环,执行循环体外的代码。
例:1-10的数字,7后面的都不打印。
[root@server ~]# vim for4.sh#!/bin/bashfor ((i=1;i<=10;i++))do if [ $i -eq 8 ];then break else echo $i fidone
3.3.exit
直接跳出程序,后面可跟状态返回码如exit 1等等。
for i in {1..5}doif [ $i -eq 3 ];then exit 100 else echo $ifidoneecho hi直接跳出程序所以不会执行最后的echo hi,并且返回码是100通过$?查看