Linux Shell是一个很难的知识板。虽然我们都很努力的学习,基本语法掌握的很好,但是有需求的时候很难直接上手编程,要么写了很久,要么写不好!对于新手来说,因为没有实践经验,写不出Shell脚本很正常。如果他们经过几年的运维还是写不出来,那就是不主动找需求,缺乏实践和经验。
方法要点
简单介绍一下写shell脚本的经验和方法。
1.理清思路:当我们要实现一个功能,需要写脚本的时候,要避免不假思索的写,避免先写一个命令来完善需要什么功能。这种写法往往会导致难以调整的结构性问题。在我们开始写脚本之前,一定要提前搞清楚这个功能怎么实现,包括用什么命令,命令的顺序。
2.整体观点:我们理清剧本的思路后,这个时候还不能马上动笔。这时候就需要在脑海中思考每一步可能出现的情况,以及各种情况发生时如何应对。在shell脚本中,有可能我们需要多个条件判断才能实现一个看似简单的功能,因为我们当前系统上的情况只是众多情况中的一种,我们必须有一个“全局观”才能让脚本在任何机器上正常运行。流行是一个消除bug的过程。
3.要像丝绸一样微妙:大家都感觉到了,shell脚本有很多引号和括号空格,每个格都有不同的含义,少空格的多个空格也有不同的含义。一次编写几十行的shell脚本并且运行时不出错仍然很困难。在学习shell script之初,我强迫自己形成一个习惯,每写完一行就检查一次各种符号括号。刚开始速度很慢,后来写的多了,速度越来越快,出错率越来越低。当我养成了习惯,后来写那些符号就成了一种习惯,不像一开始那么痛苦了。
4.好的记忆力不如坏的键盘:虽然有一句不好听的话,但是提醒一些正在学习shell脚本的朋友说出来还是不错的。当你在抱怨shell脚本有多难,多容易出错的时候,你一共写了多少行shell?你敲了多少次键盘?
下面是一些用于做练习的shell脚本示例。
1、检测服务器是否开启web服务(监听80),并判断服务种类
#!/bin/bash #################################################### #检测服务器是否开启web服务(监听80),并判断服务种类 #################################################### #捕获监听80端口的服务名称 netstat -lntp|grep ":80"|awk -F '/' '
'|sort|uniq > /tmp/80.log n=`wc -l /tmp/80.log|awk ''` 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
#!/bin/bash
## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #[/]并判断服务类型
# # # # # # # # # # # # # # # # # # # # # # # # # # #
/tmp/80 . log
n = ` WC-l/tmp/80 . log | awk ' { print $ 1 } ' `
S1 = ` cat/tmp/80 . log `
#判断服务类别的函数
;
nginx)
echo“这个服务器是nginx”
;;
tomcat)
echo“这个服务器是Tomcat”
;;
*)
echo“此服务器为其他”
;;
esac
}
if[$ n-eq 0]
然后
回显“没有web服务器!”
exit
fi
if[$n-eq 1]
then
judge _ server $ S1
else
echo“有$ n个web服务器”
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 statusG" > /tmp/sql.log n=`wc -l /tmp/sql.log|awk '
'` if [ $n -gt 0 ] then y1=`grep 'Slave_IO_Running:' /tmp/sql.log`|awk -F ':' ''|sed 's/ //g'` y2=`grep 'Slave_SQL_Running:' /tmp/sql.log`|awk -F ':' ''|sed 's/ //g'` if [ $y1 == "yes" ] && [ $y2 == "yes" ] then echo "the slave is ok" else echo "the slave is wrong" fi fi fi
#!/如果是, 从数据库中判断主从服务是否正常
# # # # # # # # # # # # # # # # # # # # # # # # # # # # #判断MySQL服务是否正常(正确执行MySQL命令)
$ MySQL cmd-e "显示进程列表"
if [$? -gt 0]
然后
附和“这个MySQL不对。”
else
#有返回值
$ MySQL cmd-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& amp[ $y2 == "yes" ]
然后
回显"奴才还好"
否则
回显"奴才错了"
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"
#!/bin/bash
# # # # # # # # # # # # # # # # # # # # # # # #
#在100以内。我在{1..100}
do
#找出余数
n = $[$ I % 3]
if[$ n-eq0]
then
sum = $
4.统计内存使用情况
#!/bin/bash ######################################### #计算一下linux系统所有进程占用内存大小的和 ######################################### count=0 # 这个循环会遍历出每个进程占用的内存大小 for i in `ps aux |awk '
' |grep -v 'RSS'` do # 将遍历出来的数字进行累加 count=$[$count+$i] done # 就得到所有进程占用内存大小的和了 echo "$count/kb"
#!/bin/bash
## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#计算linux系统中所有进程占用的内存大小之和[此循环将遍历I in ` psaux | awk ' { print $ 6 } ' | grep-v ' RSS ' `
do
#并累加遍历的数目
count = $ [$ count+$ i .获取所有进程占用的内存大小的总和
echo " $ count/kb "/h/]
后面会分享更多devops和DBA内容,感兴趣的朋友可以关注一下!