while 循环
1、while 条件句
语法
while 条件
do
指令集
done
###########################
2、until 条件句
utill 条件
do
指令集
done
##########################
范例1
每个5秒查看一下系统的负载情况
[root@LAMP 02]# vi while.sh
#!/bin/sh
while true
do
uptime >> uptime.log
sleep 5
done
[root@LAMP 02]# tailf uptime.log
22:46:21 up 8:52, 5 users, load average: 0.00, 0.00, 0.00
22:46:22 up 8:52, 5 users, load average: 0.00, 0.00, 0.00
22:46:26 up 8:52, 5 users, load average: 0.00, 0.00, 0.00
22:46:27 up 8:53, 5 users, load average: 0.00, 0.00, 0.00
22:46:31 up 8:53, 5 users, load average: 0.00, 0.00, 0.00
22:46:32 up 8:53, 5 users, load average: 0.00, 0.00, 0.00
22:46:36 up 8:53, 5 users, load average: 0.00, 0.00, 0.00
=======================================
范例2 :计算1+2+3+...+n 之和,n是传参,可以任意指定
[root@LAMP 02]# cat jihe.sh
#!/bin/sh
a=$1
b=1
sum=0
while [ $b -le $a ]
do
let sum=$sum+$b
let b++
done
echo $sum
[root@LAMP 02]# sh jiuhe.sh 100
5050
[root@LAMP 02]#
=======================
[root@LAMP 02]# cat jihe.sh
#!/bin/sh
a=$1
b=1
sum=0
while [ $b -le $a ]
do
sum=$(($sum+$b))
b=$(($b+1))
done
echo $sum
[root@LAMP 02]# sh jihe.sh 100
5050
=======================
用等差数列计算,效率最高
[root@LAMP 02]# cat jihe.sh
#!/bin/sh
a=$1
sum=0
sum=$(($(($a*$((1+$a))))/2))
echo $sum
[root@LAMP 02]# sh jihe.sh 100
5050
[root@LAMP 02]# sh jihe.sh 1000000
500000500000
[root@LAMP 02]#
=========================
######################################
范例2
手机充值100元,每次打电话3元,当余额低于0元的时候,提示余额不足,请充值
用while语句实现
[root@LAMP 02]# cat while.sh
#!/bin/sh
m=100
while [ $m -ge 0 ]
do
echo "send message :m = $m "
let m=m-3
sleep 2
done
echo "money is not enough $m : pleses input momey !!"
[root@LAMP 02]#
[root@LAMP 02]# sh while.sh
send message :m = 100
send message :m = 97
send message :m = 94
send message :m = 91
send message :m = 88
...
...
send message :m = 13
send message :m = 10
send message :m = 7
send message :m = 4
send message :m = 1
money is not enough -2 : pleses input momey !!
[root@LAMP 02]#
######################################
范例3
计算apache一天的日志 access.log 中所有行的的日志各元素的访问字节数总和,给出实现程序。
提示:
获取文件内容的方法:
方法1
cat a.log |while read line
do
done
==============
方法2、
while read line
do
done < a.log
==============
方法3、
exec <a.log
while read line
do
done
==============
[root@LAMP 02]# cat apache.sh
#!/bin/sh
sum=0
i=0
while read line
do
i=$(echo $line |awk '{print $10}')
if expr $i + 1 &>/dev/null
then
sum=$(($sum+$i))
fi
done < access.log
echo $sum
[root@LAMP 02]#
###################
没有找到合适的例子,所有我用下面的访问日志,随意找一个日志文件来获取某一个数字来计算
[root@LAMP 02]# sh apache.sh
2982
[root@LAMP 02]# cat apache.sh
#!/bin/sh
sum=0
i=0
while read line
do
i=$(echo $line |awk '{print $3}' |awk -F'=' '{print $3}'|cut -c 10 )
#echo $i
expr $i + 1 &>/dev/null
a=$?
if [ $a -eq 0 ]
then
sum=$((sum+i))
fi
done < access.log
echo $sum
[root@LAMP 02]# head -3 access.log
[172.16.0.183][18/Sep/2015:00:05:03 +0800][GET /url?a=115020310073&&u=104300025226300150914&b=460036361697955&c=A1000037D69C7C&g=0&s=0&v=5.2.27.4ctch1&p=0&id=20150917220000&f=0 HTTP/1.1][200][31]`0`
[172.16.0.182][18/Sep/2015:00:05:03 +0800][GET /url?a=115020310073&&u=104300009080897150319&b=460031390615622&c=A000004F85440D&g=0&s=0&v=5.2.27.4ctch1&p=0&id=20150917220000&f=0 HTTP/1.1][200][31]`0`
[172.16.0.184][18/Sep/2015:00:05:03 +0800][GET /url?a=115020310073&&u=104300024401506150906&b=460036860899028&c=A100004818C4B6&g=0&s=0&v=5.2.27.4ctch1&p=0&id=20150917220000&f=0 HTTP/1.1][200][31]`0`
[root@LAMP 02]#
###################
#########################################################################
范例4.随便输入一个人的名字,就好产生一个4位的随机数,并且随机数的第一位不能为0.如果是0,重新生成一个四位随机数。
[root@LAMP 03]# cat ran.sh
#!/bin/sh
a=$1
while true
do
num=`echo $RANDOM|cut -c 1-4`
b=`echo $num|cut -c 1`
if [ $b -gt 0 ]
then
echo "$a=========>$num"
exit 0
fi
done
[root@LAMP 03]#
=======================
[root@LAMP 03]# sh ran.sh xia
xia=========>3121
[root@LAMP 03]# sh ran.sh xia0
xia0=========>7314
[root@LAMP 03]# sh ran.sh xia3
xia3=========>1818
#########################################################################
范例5,每隔10秒同步mysqlbinlog同步,守护进程方式
while true
do
rsync -az /application/mysql/data/mysql-bin* rsync_backup@10.0.0.3::backup --password-file=/etc/rsync.password
sleep 10
done
########################
while 循环小结
1、while循环的特长是执行守护进程,已经希望循环不退出持续执行,用于频率小于1分钟的循环出了,,其他的while循环几乎都可以用for循环来代替
2、case语句可以用if语句替换,一般在系统启动脚本传入少量固定规则字符串时用case,其他多用if代替
3、if、for语句最常用,其次while(守护进程)、case(服务启动脚本)。