shell While 语法的用法

作者: print("") 分类: linux 发布时间: 2017-05-22 09:37

1、 当型循环和直到型循环

一) 当型和直到循环语法

while 条件句

语法:

while 条件

  do

  指令……

done

2.until条件句

until 条件

   do

   指令…..

done

提示:until应用场合不多见、了解就好。

当型和直到循环基本范例

法一:

[root@mail2 sh]# cat while.sh

#!/bin/sh
while true  ####或者使用while [ 1 ]
do
uptime
sleep 2
done

或者

#!/bin/sh
while [ 1 ]
do
uptime >>./uptime.log
usleep 100000
done

使用while 做加法1+到100 的运算。

#!/bin/sh
a=1
b=0
while ((a <= 100 ))
do
  ((b=b+a))
  ((a++))
done
[ -n "$b" ] && printf "the is number: $b\n"

用公式计算数字也可以的。范例三

[root@mail2 sh]# sh while4.sh

500000000500000000

[root@mail2 sh]# cat while3.sh

#!/bin/sh

i=100

((sum=i*(i+1)/2))

echo $sum

[root@mail2 sh]# sh while3.sh

5050

[root@mail2 sh]# cat while4.sh

#!/bin/sh

((sum=1000000000*(1000000000+1)/2))

echo $sum

[root@mail2 sh]# sh while4.sh

500000000500000000

 

公式是这样的Sn=(a1+an)n/2

范例三、用while 循环打印 10-1

[root@mail2 sh]# cat while.sh
#!/bin/sh
i=10
while ((i>0))
do
echo $i
((i--))
done
[root@mail2 sh]# sh while.sh
10
9
8
7
6
5
4
3
2
1

或者这样的

[root@mail2 sh]# vim  while1.sh
#!/bin/sh
read -t 25 -p "plase input the number" i
echo $i
while ((--i))
do
echo $i
done

或者用传参的方式

[root@mail2 sh]# vim 1.sh
#!/bin/sh
i="$1"
while [ $i -gt 0 ]
do
echo $i
((i--))
done

用until 做运算

[root@mail2 sh]# vim 2.sh

#!/bin/sh
i=1
until (( i >100 ))
do
((sum=sum+i))
((i++))
done
echo $sum

或者也可以使用传参的模式

[root@mail2 sh]# vim 2.sh
#!/bin/sh
i= "$1"
until (( i >100 ))
do
((sum=sum+i))
((i++))
done
echo $sum  

或者在最后加一个判断语句

[  -n  “$sum” ]  && echo $sum

 

用while检查 网站rul

#!/bin/sh
while true
do
curl -I -s http://www.lkq.com|head -1 >>/root/ad1.log
curl -I -s http://blog.lkq.com|head -1 >>/root/ad.log
sleep 2
done

范例5 ::实战URL是否正常的简单脚本

法一:根据 http code status 判断

#!/bin/sh
. /etc/init.d/functions
url_list=(
http://www.lkq.com
http://blog.lkq.com
)
function wait()
{
echo -n '3秒后、执行该操作'
for ((i=0;i<3;i++))
do
echo -n ".";sleep 1
done
echo
}
function check_url()
{
wait
echo 'check url....'
for ((i=0; i<`echo ${#url_list[*]}`; i++))
do
judge=($(curl -I -s ${url_list[$i]}|head -1|tr "\r" "\n"))
if [[ "${judge[1]}" == '200' && "${judge[2]}" == 'OK' ]]
then
action "${url_list[$i]}" /bin/true
else
action "${url_list[$i]}" /bin/false
fi
done
}
check_url

测试成功了。

 

范例六:把大文件拆分为指定小文件

split -l 3 test.log  

#!/bin/sh
FILE_PATH=$1
FILE_NUM=$2
i=1
sub=1
totalline='wc -l ${FILE_PATH}' | awk '{print $1}'
((inc=totalline/FILE_NUM))
cat ${FILE_PATH} |while read line
do
if ((i<inc))
  then
   ((i++))
else
  ((sub++))
  i=2
fi
echo ${line} >>${FILE_PATH}.${sub}
done

也可以用命令来分割

split -l 3 test.log  

 

 

 

 

 

范例7.分析图片服务器日志、把日志(每个图片访问次数*图片大小的总和)排名,、去top10 也就是每个url总访问大小

说明:这个功能可以用于网站流量带宽很高、分析自己的服务器有那些元素占用流量大 、进而进行优化裁剪图片、压缩js等措施

三个指标、【访问次数】 【访问次数*单个文件大小】 【文件名(可以带URL)】

解答:

测试数据

因为我们要的最终结果是某个文件的访问次数和消耗的流量、所以考虑建立以文件名索引的两个数组、一个存储访问次数、一个保存消耗的流量、这样当使用awk按行遍历文件时、对次数数组+1、同时对流量数组进行文件大小的累加、等文件扫描完成、在遍历输出两个数组既可以得到文件的反问次数和总的流量消耗

 

awk ‘{array_num[$7]++;array_size[$7]+=$10}END{for(x in array_num){print array_size[x],array_num[x],x}}’ access_log |sort -rn -k1|head -10  

方法二:

awk ‘{print $7″\t” $10}’ access_log|awk ‘{S[$1]+=$2;S1[$1]+=1}END{for(i in S) print S[i],S[i],i}’|sort -rn|head -10 >3.log

 

方法三;

[root@mail2 sh]# cut -d’ ‘ -f 7,10 access_log |sort|uniq -c | awk ‘{print $1*$3″ “$1” “$2}’|sort -rn -k1|head -10

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

说点什么

avatar
  Subscribe  
提醒