设为首页 收藏本站
查看: 1022|回复: 0

Linux学习总结(六十)shell 脚本3-for while 循环

[复制链接]

尚未签到

发表于 2018-8-22 11:35:44 | 显示全部楼层 |阅读模式
1 for 循环
  语法: for 变量名 in 条件;do ...; done
  举例1
  

#!/bin/bash  
sum=0
  
for i in `seq 1 100`;do
  
sum=$[$sum+$i]
  
done
  
echo $sum
  

  举例2
  找到/123 目录下所有后缀名为.txt的文件
  批量修改.txt 为.txt.bak
  分析:
  可以有两种办法,一种是find结合xarge命令,另一种为循环。
  方法一:
  

#!/bin/bash  
find /123/ -type f -name "*.txt" |xargs -i mv{} {}.bak
  

  方法二:
  

#!/bin/bash  
cd /123/
  
for f in `ls *.txt`;do
  
mv $f $f.bak
  
done
  

2 while 循环
  语法: while 条件;do ... ;done
  

#!/bin/bash  
sum=0
  i=1
  while [ $i -le 100 ]
  do
  sum=`expr $sum + $i`
  i=`expr $i + 1`
  done
  
echo $sum
  

  通常我们写一个监控脚本可以用while做一个死循环。
  每隔半分钟查看下系统负载,当负载高于10时发送邮件通知。
  

#!/bin/bash  
while true
  
do
  load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d '.' -f1`
  if [ $load -gt 10 ]
  then
  /usr/lib/zabbix/alertscripts/mail.py  lvlinux@163.com  "load is high"  "load is high: $load"
  fi
  sleep 30
  
done
  

  备注:
  w 命令用来查看系统负载,
  head -1 显示第一行,w |head -1 等价于命令uptime
  awk -F 'load average: ' '{print $2}'    表示以load average: 为分隔符切割,打印第二段
  cut -d '.' -f1 表示以点为切割符,打印第一段
  备注:我们在load average: 后面加一个空格,得到的结果前面就不会有空格。不加空格的话,还可以再接sed去掉空格
  上面命令等价于w|head -1|awk -F 'load average:' '{print $2}'|cut -d '.' -f1 |sed 's/ //'
  当负载超过10时用python脚本发邮件通知,格式为脚本后面跟邮箱名,主题,内容。
  对于单个字符作为分隔符,cut可以实现awk的切割打印功能,但是cut不支持字符串作为切割符。

3 循环中的continue
  忽略掉本次循环的操作,直接进入下一次循环。
  

#!/bin/bash  
for i in `seq 1 5`;do
  if [ $i -eq 3 ];then
  continue
  fi
  echo -e "$i \c"
  
done
  

  运行结果为 1 2  4  5 ,continue 成功跳过了循环变量为3的操作。

4 循环中的break
  碰到break语句,直接跳出当前循环。
  

#!/bin/bash  
for i in `seq 1 5`;do
  if [ $i -eq 4 ];then
  break
  fi
  echo $i
  
done
  

  运行结果为1 2 3。当循环到4时,直接跳出循环,不再执行循环中任何语句。

5 exit 语句
  碰到exit语句,直接结束脚本。
  

#!/bin/bash  
for i in `seq 1 5`;do
  if [ $i -eq 4 ];then
  exit
  fi
  echo $i
  
done
  
echo "hello world"
  

  执行结果为1 2 3 ,我们发现最后循环外面的echo语句也没有执行,如果把exit换成break,则会多出一句hello world

6 用while 实现的交互式重复输入案例
  需求:提示用户输入数字,若不输入,则提示输入内容,若输入不是纯数字,则提示输入数字,直到正确输入为止
  

#!/bin/bash  
while [ 1 ]
  
do
  read -p "please input a number:" n
  if [ -z $n ];then
  echo "please input sth"
  continue
  fi
  n1=`echo $n|sed 's/[0-9]//g'`
  if [ -n "$n1" ];then
  echo "please input a pure number"
  continue
  fi
  break
  
done
  
echo $n
  

  备注:while死循环实现重复交互,第一次if判断,当用户未输入字符时,则满足-z变量值为空的条件,并给出提示,需要输入字符。同时执行continue,循环从头开始,再次要求用户输入。
  当用户输入非数字时,满足第二个if条件,给出提示,需要输入纯数字,同时执行continue,循环从头开始,再次要求用户输入。
  当用户正确输入时,直接执行break语句,跳出循环,并且输出用户输入的数字。while [ 1 ] 可以换作 while : 或者while true



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-555081-1-1.html 上篇帖子: shell脚本 for循环、break跳出循环、continue结束本次循环 下篇帖子: DAY11 Shell脚本基础(Enginner05-1)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表