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

shell脚本应用(三)for、while、case语句

[复制链接]

尚未签到

发表于 2018-8-18 06:28:30 | 显示全部楼层 |阅读模式
  前言:当面对各种列表重复任务时,使用if语句已经难以满足要求,而顺序编写全部代码更是显得异常繁琐,困难重重。使用循环、分支等其他程序控制结构,从而能够轻松完成更加复杂、强大的功能。
  1、使用for循环语句
  for语句结构:
  for   变量名   in   取值列表
  do
  命令序列
  done
  for循环语句的结构:
DSC0000.jpg

  1)根据姓名列表批量添加用户
  准备员工列表文件users.txt,然后编写一个名为uaddfor.sh的脚本,从users.txt文件中读取各用户名称,重复执行添加用户,设置初始密码的相关操作。
  [root@localhost ~]# vim /root/user.txt                    //用作测试的列表文件
  chenpeng
  dengchao
  zhangjie
  批量添加用户的脚本
  [root@localhost ~]# vim uaddfor.sh
  #!/bin/bash
  ulist=$(cat /root/user.txt)
  for uname in $ulist
  do
  useradd $uname
  echo "123456" | passwd --stdin $uname &> /dev/null
  done
  [root@localhost ~]# chmod +x uaddfor.sh        //添加执行权限
  [root@localhost ~]# ./uaddfor.sh                     //测试并确认执行结果
  [root@localhost ~]# tail -3 /etc/passwd
  chenpeng:x:501:501::/home/chenpeng:/bin/bash
  dengchao:x:502:502::/home/dengchao:/bin/bash
  zhangjie:x:503:503::/home/zhangjie:/bin/bash
  2)若要删除uaddfor.sh脚本添加的用户,只需要将上面脚本中添加用户的命令改为删除的即可。
  [root@localhost ~]# cp uaddfor.sh udelfor.sh
  [root@localhost ~]# vim udelfor.sh              //批量删除用户的脚本
  #!/bin/bash
  ulist=$(cat /root/user.txt)
  for uname in $ulist
  do
  userdel $uname
  echo "123456" | passwd --stdin $uname &> /dev/null
  done
  [root@localhost ~]# chmod +x udelfor.sh
  [root@localhost ~]# ./udelfor.sh

  [root@localhost ~]#>  id: chenpeng:无此用户
  执行脚本之后发现用户已经删除
  3)根据ip地址列表查看主机状态
  首先建立ip地址列表文件ipadds.txt,然后编写一个名为chkhosts.sh的shell脚本,从ipadds.txt文件中读取各服务器的ip地址,重复执行ping连通性测试,并根据测试结果输出相应的提示信息。
  [root@localhost ~]# vim /root/ipadds.txt            //用作测试的列表文件
  192.168.1.1
  192.168.1.2
  192.168.1.10
  [root@localhost ~]# vim /chkhosts.sh               //循环检查各主机的脚本
  #!/bin/bash
  hlist=$(cat /root/ipadds.txt)
  for ip in $hlist
  do
  ping -c 3 -i 0.2 -W 3 $ip &> /dev/null
  if [ $? -eq 0 ]
  then
  echo "host $ip is up"
  else
  echo "host $ip is down"
  fi
  done
  执行脚本
  [root@localhost /]# chmod +x chkhosts.sh
  [root@localhost /]# ./chkhosts.sh
  host 192.168.1.1 is up
  host 192.168.1.2 is down
  host 192.168.1.10 is down
  2、使用while循环语句
  For循环适合无规律,列表已固定,while循环适合要求循环次数,操作对象按数字顺序编号,按特定条件执行重复操作的情况。
  while语句的语法结构:
  while   条件测试操作
  do
  命令序列
  done
  while循环语句的结构:
DSC0001.jpg

  1)批量添加规律编号的用户,添加20个用户,名称依次为stu1,stu2,... Stu20
  [root@localhost /]# vim uaddwhile.sh
  #!/bin/bash
  prefix="stu"
  i=1
  while [ $i -le 20 ]
  do
  useradd ${prefix}$i
  echo "123456" | passwd --stdin ${prefix}$i &> /dev/null
  let i++
  done
  [root@localhost /]# chmod +x uaddwhile.sh
  [root@localhost /]# ./uaddwhile.sh
  [root@localhost /]# grep "stu" /etc/passwd | tail -3
  stu18:x:518:518::/home/stu18:/bin/bash
  stu19:x:519:519::/home/stu19:/bin/bash
  stu20:x:520:520::/home/stu20:/bin/bash
  2)删除所添加的用户,只需将上述代码useradd修改成userdel即可
  [root@localhost /]# cp uaddwhile.sh udelwhile.sh
  [root@localhost /]# vim udelwhile.sh
  #!/bin/bash
  prefix="stu"
  i=1
  while [ $i -le 20 ]
  do
  userdel ${prefix}$i
  echo "123456" | passwd --stdin ${prefix}$i &> /dev/null
  let i++
  done
  [root@localhost /]# chmod +x udelwhile.sh
  [root@localhost /]# ./udelwhile.sh

  [root@localhost /]#>  id: stu20:无此用户
  3)猜价格游戏
  案例要求如下:由脚本预先生成一个随机的价格数目(0~999)作为实际价格,判断用户猜测的价格是否高出或低出实际价格,给出相应的提示够再次要求用户猜测;一直到用户猜中实际价格为止,输出用户共猜测的次数、实际价格。
  思路:通过环境变量RANDOM可获得一个小于2的16次方的随机整数,计算其与1000的余数即可获得0-999的随机价格,反复猜测操作可以通过以true作为测试条件的while循环实现,当用户猜中实际价格时终止循环,判断猜测价格与实际价格的过程采用if语句实现,嵌套在while循环体内,使用变量来记录猜测次数。
  [root@localhost /]# vim pricegame.sh
  #!/bin/bash
  price=$(expr $RANDOM % 1000)
  TIMES=0
  echo "shangpin 0-999,ni cai?"
  while true
  do
  read -p "qing shu ru:" INT
  let TIMES++
  if [ $INT -eq $price ] ; then
  echo "gongxi, jiageshi:$price"
  echo "ni cai le $TIMES ci"
  exit 0
  elif [ $INT -gt $price ] ; then
  echo "taigaole"
  else
  echo "taidile"
  fi
  done
  [root@localhost /]# chmod +x pricegame.sh
  [root@localhost /]# ./pricegame.sh
  shangpin 0-999,ni cai?
  qing shu ru:500
  taigaole
  qing shu ru:400
  taidile
  qing shu ru:450
  taidile
  qing shu ru:470
  taigaole
  qing shu ru:469
  taigaole
  qing shu ru:460
  gongxi, jiageshi:460
  ni cai le 6 ci
  3、使用case分支语句
  Case语句可以使用脚本程序的结构更加清晰。与if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值。
  case分支语句的语法结构:
  case    变量值    in
  模式1)
  命令序列1
  ;;
  模式2)
  命令序列2
  ;;
  ......................
  
  默认命令序列
  esac
  (是通配符,可匹配任意值)
  case分支语句的结构:
DSC0002.jpg

  使用case分支语句时,需要注意:
  1,case行尾必须为单词“in”,每一模式必须以右括号“)”结束
  2,双分号“;;”表示命令序列的结束
  3,模式字符串中,可以用方括号表示一个连续的范围,如【0-9】;还可以用竖杠符号“|”表示或,如“A|B”
  4,最后的“)”表示默认模式,其中的相当于通配符
  1)检查用户输入一个字符,通过case语句判断该字符是否为字母,数组或其他控制字符,并给出相应的提示信息。
  [root@localhost /]# vim hitkey.sh
  #!/bin/bash
  read -p "qingshuru:" KEY
  case "$KEY" in
  [a-z] | [A-Z])
  echo "ni shu ru de shi zimu"
  ;;
  [0-9])
  echo "ni shu ru de shi shuzi"
  ;;
  )
  echo "ni shu ru de shi qita"
  esac
  [root@localhost /]# chmod +x hitkey.sh
  [root@localhost /]# ./hitkey.sh
  qingshuru:z
  ni shu ru de shi zimu
  [root@localhost /]# ./hitkey.sh
  qingshuru:7
  ni shu ru de shi shuzi
  [root@localhost /]# ./hitkey.sh
  qingshuru:  /
  ni shu ru de shi qita
  2)编写系统服务脚本
  通过位置变量$1指定的start,stop,restart,status控制参数,分别用来启动、停止、重启sleep进程,以及查看sleep进程的状态。
  [root@localhost /]# vim myprog
  #!/bin/bash
  #chkconfig - 90 10
  #description:aaaaaaaaaa
  case "$1" in
  start)
  echo -n "zhengzaiqidong  sleep fuwu..."
  if sleep 7200 &                                             //在后台启动sleep进程
  then
  echo "ok"
  fi
  ;;
  stop)
  echo -n "zhengzaitingzhi sleep fuwu"
  pkill "sleep" &> /dev/null                                //杀死sleep进程
  echo "ok"
  ;;
  status)
  if pgrep "sleep" &> /dev/null ; then                //判断并提示sleep进程状态
  echo "sleep fuwu yiqidong"
  else
  echo "sleep fuwu yitingzhi"
  fi
  ;;
  restart)                                                      //先停止,再启动服务
  $0 stop
  $0 start
  ;;
  )                                                            //默认显示用法信息
  echo "yongfa: $0 {start|stop|status|restart}"
  esac
  [root@localhost /]# chmod +x myprog
  [root@localhost /]# ./myprog start
  zhengzaiqidong  sleep fuwu...ok
  [root@localhost /]# ./myprog status
  sleep fuwu yiqidong
  [root@localhost /]# ./myprog stop
  zhengzaitingzhi sleep fuwuok

  [root@localhost /]# ./myprog>  yongfa: ./myprog {start|stop|status|restart}
  然后执行下面的命令添加myprog为系统服务
  [root@localhost /]# cp myprog /etc/init.d/
DSC0003.jpg



运维网声明 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-553171-1-1.html 上篇帖子: shell脚本中的SQL*Plus的环境变量 下篇帖子: 用shell开发跳板机
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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