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(服务启动脚本)。