详解Linux Shell脚本编写技巧,附实例说明

发表于:2019-8-14 09:52

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:波波说运维    来源:今日头条

  Linux Shell是一个很难的知识板块。虽然大家都认真学,基本的语法很都掌握,但有需求时,很难直接上手编程,要么写了很久,要么写不好!对于初学者而言,因为没有实战经验,写不出来Shell脚本很正常,如果工作了几年的运维还是写不出来,那就是没主动找需求,缺乏练习,缺乏经验。
  方法要点
  简单介绍一下编写shell脚本的时候的经验和方法。
  理清思路:在我们想实现一个功能需要写脚本的时候是切忌不要想到就写,避免需要什么功能就先写个什么命令再去完善,这种写法常常会出现在结构上很难调整的问题。在我们开始写脚本之前一定要事先理清楚要怎么去实现这个功能,包括用什么命令和命令的先后顺序。
  全局观:当我们理清脚本的思路之后,我们这个时候也不能马上就开始写,这个时候我们需要在脑海中思考每一个步骤中可能出现的情况,当出现各种情况后如何应对。在shell脚本中有可能我们要实现一个看似简单的功能会需要有多个条件判断,因为出现在我们当前系统上的情况只是在众多情况中的一种,我们要实现让脚本在任何机器上都能正常运行就必须有“全局观”。通俗讲就是一个排除bug的过程。
  心细如丝:正如大家感慨的一样,shell脚本有非常多的引号括号空格,每一种意义不一样,多个空格少个空格意义又不一样,写个几十行的shell脚本能一次性写完就无错运行还是有一些难度的。我的在学习shell脚本一开始就强行给自己养成一个习惯,每写完一行就检查一次各种符号括号,刚开始速度非常慢,但是写得多了速度就越来越快而且出错率也越来越低,当养成习惯以后再去写那些符号就成了习惯没有刚开始那么痛苦了。
  好记性不如烂键盘:有一句不好听的话虽然不好听,但是能提醒到一些正在学习shell脚本的朋友说出来也挺好。当你在抱怨shell脚本如何难写如何易出错的时候那么你总共写过多少行shell?你敲过多少次键盘?
  下面分享几个shell脚本实例做练习。
  1. 检测服务器是否开启web服务(监听80),并判断服务种类
   #!/bin/bash
  ####################################################
  #检测服务器是否开启web服务(监听80),并判断服务种类
  ####################################################
  #捕获监听80端口的服务名称
  netstat -lntp|grep ":80"|awk -F '/' '{print $2}'|sort|uniq > /tmp/80.log
  n=`wc -l /tmp/80.log|awk '{print $1}'`
  s1=`cat /tmp/80.log`
  #判断服务种类函数
  judge_server()
  {
  case $1 in
  httpd)
  echo "this server is apache"
  ;;
  nginx)
  echo "this server is nginx"
  ;;
  tomcat)
  echo "this server is tomcat"
  ;;
  *)
  echo "this server is other"
  ;;
  esac
  }
  if [ $n -eq 0 ]
  then
  echo "no web server!"
  exit
  fi
  if [ $n -eq 1 ]
  then
  judge_server $s1
  else
  echo "there are $n web servers"
  for web in `cat /tmp/80.log`
  judge_server $web
  fi
  
    2. 检测MySQL服务是否正常,判断是主库还是从库,如是从库判断主从服务是否正常
   #!/bin/bash
  ##################################################################
  #检测MySQL服务是否正常,判断是主库还是从库,如是从库判断主从服务是否正常
  ##################################################################
  mysqlcmd="mysql -uroot -p123456"
  #判断MySQL服务是否正常(正确执行MySQL命令)
  $mysqlcmd -e "show processlist"
  if [ $? -gt 0 ]
  then
  echo "this mysql is wrong."
  else
  #如果是从库则有返回值
  $mysqlcmd -e "show slave status\G" > /tmp/sql.log
  n=`wc -l /tmp/sql.log|awk '{print $1}'`
  if [ $n -gt 0 ]
  then
  y1=`grep 'Slave_IO_Running:' /tmp/sql.log`|awk -F ':' '{print $2}'|sed 's/ //g'`
  y2=`grep 'Slave_SQL_Running:' /tmp/sql.log`|awk -F ':' '{print $2}'|sed 's/ //g'`
  if [ $y1 == "yes" ] && [ $y2 == "yes" ]
  then
  echo "the slave is ok"
  else
  echo "the slave is wrong"
  fi
  fi
  fi
  
     3. 计算100以内所有能被3整除的正整数的和
   #!/bin/bash
  #############################################
  #计算100以内所有能被3整除的正整数的和
  ############################################
  sum=0
  for i in {1..100}
  do
  #求余数
  n=$[$i%3]
  if [ $n -eq 0 ]
  then
  sum=$[$sum+$i]
  fi
  done
  echo "sum:$sum"
  
     4. 统计内存使用
   #!/bin/bash
  #############################################
  #计算100以内所有能被3整除的正整数的和
  ############################################
  sum=0
  for i in {1..100}
  do
  #求余数
  n=$[$i%3]
  if [ $n -eq 0 ]
  then
  sum=$[$sum+$i]
  fi
  done
  echo "sum:$sum"


     上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号