运维界的卡乐咪

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1当型循环和直到型循环

while循环工作中使用的不多,一般是守护进程程序或始终循执行场景会用,其它循环计算,都会替换while

1.1当型和直到型循环语法

  ①while 条件句

  语法:

  while 条件

    do

    指令...

  done

  提示:

  如手机充值100元:发短信扣费,每次扣1角5,当费用低于1角5,就不能发了。

  ②until 条件句

  语法:

  until 条件

    do

    指令...

  done

  提示:until应用场合不多,了解即可

1.2当型和直到型循环范例:

sleep 1 #<==休息1秒,usleep 1000000 #<==休息1秒,达到一分钟就用定时任务。

每隔两秒屏幕输出负载值

方法一:

[root@localhost ~]# cat whiletest.sh
#!/bin/sh
while true
  do
    uptime
    sleep 2
done
方法二:

[root@localhost ~]# cat whiletest.sh
#!/bin/sh
while [ 1 ]  #==>条件与方法一有区别
  do
    uptime >>./uptime.log
    sleep 1000000  #==>以微秒为单位
done
[root@localhost ~]sh whiletest.sh &     ===>后台执行脚本

提示:在后台永久执行,我们称之为守护进程模式。

防止客户端执行脚本执行中断的方法:

1)sh whiletest.sh &

2)nohup /root/sh whiletest.sh &

3)screen保持会话,推荐使用

2.脚本后台执行知识拓展:

a功能和用途

功能                  用途

sh whiletest.sh &         把脚本whiletest.sh放后台执行

ctrl+c              停止当前执行的脚本或任务

ctrl+z             暂停当前执行的脚本或任务

bg               把当前脚本或任务放到后台执行,background

fg               把当前脚本或任务拿到前台执行,frontground如果多个任务可以fg 加任务编号调出如:fg 1

jobs             查看当前执行的脚本或任务

kill              [root@localhost ~]# sh whiletest.sh &
               [1] 2966
               [root@localhost ~]# kill -9 %1

3.进程管理(16个命令)总结:

bg:后台运行

fg:挂起程序

jobs:显示后台程序

kill,killall,pkill:杀掉进程

crontab:设置定时任务

ps:查看进程

pstree:显示进程状态树

top:显示进程

nice:改变优先权

nohup:用户退出系统之后继续工作

pgrp:查找匹配条件的进程

strace:跟踪一个进程的系统调用情况

ltrace:跟踪进程调用库函数的情况

vmstat:报告虚拟内存统计信息

 

实例:用while实现从1加到100

[root@localhost ~]# cat whiletest.sh
#!/bin/sh
i=1
total=0
while [ $i -le 100 ]
  do
    total=$(($i+$total))
    i=$(($i+1))
done
echo "$total"
[root@localhost ~]# sh whiletest.sh
5050
用数学公式实现:

[root@localhost ~]# cat whiletest.sh
#!/bin/sh
i=100
((sum=i*(i+1)/2))
echo $sum
[root@localhost ~]# sh whiletest.sh
5050
实例①:

手机充值,例如:充值10元,每发一次短信(输出当前余额)扣1角5分,当余额低于1角5分不能发短信,提示余额不足,请充值(可以允许用户继续充值发短信),请用while语句实现。


#!/bin/sh
i=1000
ms=15
chongzhi(){
 while [ $i -ge $ms ]
  do
    read -p "请确认是否发生短信?【y|n】" choice
  case $choice in
    y|Y)
       echo "发送成功!"
            ((i=$i-$ms))
           echo "当前余额 $i"
    ;;
        n|N)
       echo "取消发送"
       exit 1
    ;;
    *)
      echo "Input Error!"
    ;;
  esac
       
done

if [ $i -lt $ms ];then
    echo '
        余额不足请充值!
        y 充值
        n 不充值
        '
        read -p "请输入是否需要充值" num
        case $num in
          y)
       read -p "请输入需要充值的金额:" money
           ((i=$i+$money))
           echo "充值成功,当前余额$i"
    ;;
          n)
           echo "余额不足退出"
           exit 1
    ;;
        esac
fi
}
while true
do
chongzhi
done

实例②:

猜数字游戏:首先让系统随机生成一个数字,给这个数字一个范围(数字前50及后50),让用户输入猜的数字,对输入判断,如果不符合数字就给予高与低的提示,猜对后给下猜对用的次数,请问while语句实现。

 

 

实例③:

统计Apache日志,一天的ip访问量

方法一:

#!/bin/sh
exec < access_2019-12-12.log
while read line
do
  i=`echo $line|awk '{print $10}'`
  expr $i + 1 &>/dev/null
  if [ $? -ne 0 ];then
        continue
  fi
  ((sum+=i))
done
[ -n "$sum" ]&& echo $sum

方法二:

#!/bin/sh
while read line
do
  i=`echo $line|awk '{print $10}'`
  expr $i + 1 &>/dev/null
  if [ $? -ne 0 ];then
        continue
  fi
  ((sum+=i))
done< access_2019-12-12.log
[ -n "$sum" ]&& echo $sum

实例④:

一个日志a.log里有10个IP记录,每10s一个导出到b.log里,导出到a.log和b.log内容一样。

提示a.log里的IP是逐个减少的。

 

while循环小结:

1.while循环的特长是执行守护进程以及我们希望循环不退出持续执行的场景,用于频率小于1分钟的循环处理,其他的while循环几乎都可以被for循环代替。

2.几乎所有的case语句可以if语句替换,一般在系统启动脚本传入少量固定规则字符串,用case语句,其他普通判断多用if。

3.一句话,if,for语句最常用,其次while(守护进程),case(服务启动脚本)。

各个语句使用场景:

条件表达式,简短的判断(文件是否存在,字符串是否为空等)

if 取值判断,不同值数量较少的情况。

for 正常的循环处理,最常用!

while 守护进程、无限循环(sleep)

case服务启动脚本、菜单。

函数逻辑清晰,减少重复语句。

 

posted on 2020-03-03 12:23  卡乐咪运维  阅读(466)  评论(0)    收藏  举报