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

shell中的流程控制语句

[复制链接]

尚未签到

发表于 2018-8-26 13:29:06 | 显示全部楼层 |阅读模式
  shell中的流程控制语句
  1、if语句
  (1)单分支if条n件语句:
  1)语法:
  if [ 条件判断式 ];then
  动作
  fi
  或:
  if [ 条件判断式 ]
  then
  动作
  fi
  2)案例:
  例1:判断文件是否存在,不存在则创建
  #!/bin/sh
  path=/root/script/
  file=if1.sh
  #mkdir
  if [ ! -d ${path} ];then
  mkdir -p ${path}
  echo "${path} dir is not exit,already created it"
  fi
  #touch file
  if [ ! -f ${path}${file} ]
  then
  touch ${path}${file}
  echo "${path}${file} is not exit,already created it"
  exit
  fi
  ls -l  ${path}${file}
  例2:判断磁盘使用率最大的分区,大于80%则报警
  #!/bin/sh
  usate=`df -h | tr -s " " | sort -nr -t" " -k5  | head -1 | awk '{print $5}' | cut -d"%" -f1`
  namedev=`df -h | tr -s " " | sort -nr -t" " -k5  | head -1 | awk '{print $1}'`
  if [ $usate -ge 80 ];then
  echo "warning! ${namedev} is full"
  fi
  例3:新建shell脚本时写入注释信息并进入到第六行
  #!/bin/bash
  NEWNAME=$1
  if ! grep -q "#!" ${NEWNAME} ;then
  cat>>${NEWNAME} /tmp/etcbak/etcinfo.txt

  echo "Date>  cd /tmp/etcbak
  tar -zcf etc-${rate}.tar.gz /etc etcinfo.txt &>/dev/null
  rm -rf /tmp/etcbak/etcifo.txt
  else
  mkdir /tmp/etcbak
  echo "Date:${rate}" >> /tmp/etcbak/etcinfo.txt

  echo "Date>  cd /tmp/etcbak
  tar -zcf etc-${rate}.tar.gz /etc etcinfo.txt &>/dev/null
  rm -rf /tmp/etcbak/etcifo.txt
  fi
  例2:(方法1)判断httpd服务是否启动
  #!/bin/sh
  port=`nmap -sT 172.16.250.102 | grep tcp | grep http | awk '{print $2}'`
  if [ "$port" == "open" ]
  then
  echo "$(date +%F-%T) httpd is ok" >> /tmp/autostart-acc.log
  else
  systemctl start httpd &> /dev.null
  echo "$(date +%F-%T) restart httpd!!" >>/tmp/autostart-err.log
  fi
  (方法2)判断httpd服务是否启动
  #!/bin/bash
  while true; do
  COUNT=`ps aux | grep "httpd" | grep -v "grep" | wc -l`
  #echo ${COUNT}
  if [ ${COUNT} -eq 0 ];then
  systemctl start httpd
  echo "------`date "+%F %T"` server down" >> httpd.log
  fi
  sleep 60
  done
  (2)双分支if条件语句:
  1)语法:
  if [ 条件判断式1 ]
  then
  条件1成立时,执行该动作
  elif [ 条件判断式2 ]
  then
  条件2成立时,执行该动作
  elif [ 条件判断式3 ]
  then
  条件3成立时,执行该动作
  ……
  else
  当所有条件都不成立时,执行该动作
  fi
  2)案例
  例1:判断两个整数的大小
  #!/bin/sh
  read -p "please input two number:" a b
  #no1
  [ -z $a ] || [ -z $b ] && {
  echo "please input two number agcogin"
  exit 1
  }
  #no 2
  expr $a + 0 &>/dev/null
  RETVAL1=$?
  expr $b + 0 &>/dev/null
  RETVAL2=$?
  test $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 || {
  echo -e "please input two \033[31m number \033[0m again!!"
  exit 2
  }
  #no3
  if [ $a -lt $b ]
  then
  echo "$a < $b "
  elif [ $a -eq $b ]
  then
  echo "$a = $b"
  else
  echo "$a > $b "
  fi
  例2:输入一个文件判断是什么文件
  #!/bin/sh
  read -p "please input one filename:" file
  if [ -z $file ]
  then
  echo "error,please input a filename"
  exit 1
  elif [ -f "$file" ]
  then
  echo "$file is a ragulare file"
  elif [ -d "$file" ]
  then
  echo "$file is a directory"
  elif [ -L "$file" ]
  then
  echo "$file is a linkfile"
  else
  echo "sorry i don't know"
  fi
  2、for循环
  (1)语法
  1)语法一:
  for 变量 in  值1 值2 值3
  do
  程序
  done
  例:批量解压
  #!/bin/sh
  cd /tmp/baktar
  ls *.tar.gz > ls.log
  for i in $(cat ls.log)
  do
  tar -zxf $i &>> /dev/null
  done
  rm -rf /tmp/baktar/ls.log
  2)语法二:
  for (( 初始值;循环控制条件;变量变化 ))
  do
  程序
  done
  例:从1加到100
  #!/bin/sh
  s=0
  for (( i=1;i /dev/null
  done
  else
  echo "user number error"
  fi
  fi
  例2:计算0到100的和并输出计算过程:
  #!/bin/sh
  sum=0
  for(( i=1;i /etc/hosts.deny
  fi
  fi
  done < hacker.log
  done
  例2:DOS***自动防护脚本(执行时需要放入后台如:sh whidos.sh &)
  #!/bin/sh
  while true
  do
  awk '{print $1}' /var/log/httpd/access_log | grep -v "^$" | sort | uniq -c >/tmp/tmp.log
  exec >/tmp/drop/list.log
  fi
  done
  sleep 200
  done
  例3:编写一个猜数字的游戏:要猜的数字为1 到100 的随机整数,用户执行程序后根据提示输入一个数字,若输入的数字等于要猜的数字,提示成功,程序结束。若输入的数字不等于要猜的数字,提示大于或者小于要猜的数字,然后提示用户继续输入答案,直到用户猜出正确答案数字,程序终止
  #!/bin/sh
  AGE=`echo $[RANDOM%101]`
  #echo $AGE
  while true
  do
  read -p "please age,'q' or 'exit' to exit:" age
  [ "$age" == "q" -o "$age" == "exit" ] && exit 0
  #no1
  [ -z "$age" ] && echo "please a number" && continue
  #no2
  expr $age + 0 &>/dev/null
  ret=$?
  [ $ret -ne 0 ] && echo "please input a integer" && continue
  #no3
  if [ $age -eq $AGE ]
  then
  echo "guess right.........."
  exit 0
  elif [ $age -lt $AGE ]
  then
  echo "cai xiao le"
  else
  echo "cai da le"
  fi
  done


运维网声明 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.yunweiku.com/thread-556883-1-1.html 上篇帖子: shell脚本编程之内置字符串处理工具 下篇帖子: linux学习笔记:shell脚本编程相关(上)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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