(二)shell脚本开发小案例
脚本开发就是把复杂的命令执行过程,通过逻辑代码,组成一个脚本文件,再去执行该文件即可。
所以脚本开发首先要想好脚本的功能、作用、以及需求,然后再构思shell代码来完成这个功能、作用及需求。
但是,构思shell代码的时候,就会涉及到shell语法、shell命令、shell函数、if逻辑判断、for循环等。
1、简单脚本示例:
下面是一个最简单的脚本,功能是显示一下日期和登录用户:
2、稍复杂的脚本示例:
开发一个计算2个整数、并且只能进行加减乘除四则运算的一个脚本。脚本要
(1)接受用户输入的数字和运算符号
(2)对用户输入的内容进行是不是数字、是不是运算符号的判断
(3)进行结果计算,并输出打印
A:这是一个shebang,定义这个脚本文件是用bash解释器执行的。
B:这里我们是定义了一个函数,函数名是print_instruct()。函数的功能是printf打印一句话,最后的\n是换行的意思,因为printf命令不换行。
exit 1 是给脚本的执行结果赋予一个状态码,也就是退出码。
函数的用法如下:
printf和exit的退出码用法如下:
C:read是接受用户输入的一个命令,-p是参数,表示提示信息,意思是后面""中的内容给用户看,firstnum变量是将用户输入的内容赋值给firstnum变量。
if代码块解读:如果firstnum变量符合某个条件,就执行print_instruct函数,如果不符合条件if代码块就跳过不执行。
if代码块的语法是:if后面必须有一个空格,然后是方括号[],并且方括号里面的内容是前后都和方括号的前后空一格。
-n 参数是if语句的参数,表示如何""里面的字符串为空,条件就不成立,就是不执行if代码块,如果""里面的字符串不空,条件就成立,执行if代码块。
echo $firstnum 是一个命令,就是打印变量firstnum,打印完毕后通过管道符|交给sed命令处理,sed命令的处理方式是:'s/[0-9]//g',意思是sed将firstname变量的值中的所有0-9的数字都s替换成空g,这样命令:echo $firstnum |sed 's/[0-9]//g'执行完毕,如果用户输入中有非数字的字符,if条件就成立,就执行if下面的代码块,就是让用户重新输入。如果用户输入的全部是数字,则if条件就不成立,就不执行if代码块,直接往下运行代码了。
D、E和C同理,就不详解了。
F:就是一个双小括号进行的一个计算了。
3、开发一个nginx存活检测脚本
开发一个检测nginx服务是否运行的脚本,也就是检测nginx服务状态的一个脚本。
解释:
(1)要习惯用函数来开发脚本,这里我就写一个函数CheckUrl函数。函数名后面跟一个小括号然后紧跟一个花括号,花括号里面就是这个函数的函数体。
(2)timeout是我定义的一个变量名,用这个变量来表示超时了多少秒。为什么要定义这个变量呢?因为我们后面要去监测网址是否存活,我们是用wget命令监测的,wget在请求要监测的网址的时候,可能会由于网络延时的问题,wget就没有正确的发出请求、或者发出了没有得到及时响应,所以这里要设置一个超时等待的时间。
fails也是我定义的一个变量,这个变量的作用是:当wget请求目标网站的时候,wget本身就有重连机制,就是当第一次请求没有连接上,它会继续请求连接,所以这里我们定义一个fails变量就相当于一个计数器,计数我们请求连接了多少次,当2次连接都失败,我们就判断这个网站挂了,赶紧排查。 同理,success也是我们定义的一个变量,这个变量是计数wget连接成功的次数,当wget连接成功2次及以上,就判断这个网站是正常运行中。
(3)while true 是无限循环,就是一直的循环监测,直到条件不满足才终止循环。
(4)do done 是循环体的标志,就是开始循环,do xxxxxx done ,就是循环体中的代码在do和done之间。
(5)wget命名是去访问一个站点,有很多参数,详情可以自己百度一下,这里我们只用下面5个参数:
--timeout是wget的参数,是设置超时时间的,就是将超时设置为5秒。
--tries也是wget的参数,是wget的重连机制,就是设置重连次数。
http://192.168.159.100:80 是我nginx运行的主机ip和端口号
-q是静默输出,就是不显示信息
-o是将结果写入黑洞文件,也就是日志信息写入黑洞
(6)if 是条件判断。只要wget命令正确执行了,特殊状态变量$? 的返回值就是0 ,所以当返回值不是0就是wget没有连接上站点,fails变量就加1,否则,success变量加1
(7)-ne是if条件的参数,表示不等于。-ge表示大于等于。
如果success大于等于1,就打印网址正常,并且循环退出码设置为0,因为0就表示正确执行了。
如果fails大于等于2,就是wget连接2次都失败了,就打印网址挂了,并设置循环退出码为2。
(8)最后一行是我们调用上面写的函数。如果你写了一个函数,但你没调用就不执行。
(9)代码里面的闭环结构,比如{},比如do done、if fi等,都可以用shift+ % 找到其另一半。
脚本运行效果如下:
4、判断文件名后缀是否合法
这是一个使用expr命令的小例子,因为expr支持正则匹配。
执行脚本,传入一个文件名,然后判断该文件名是否是jpg图片文件。
解释:
if是条件判断。expr "$1" ":" ".*.jpg" 是if的条件
expr命令的语法是:expr 字符串 ":" ".*"
expr功能是:当字符串匹配上了,就统计其长度,当匹配不上,就返回0。
$1是传入的第一个参数
\.jpg 前面的反斜杠是转义.点的,就是找出匹配.jpg字符
&> /dev/null 表示让 if条件判断的执行 在后台运行,并且判断结果写入黑洞。
如果执行成功,就是匹配上了,expr命令返回非0值,这个非0值就写入黑洞文件。此时if条件就是true,就打印文件名正确;否则expr返回0值,if条件false,就执行else代码块,就打印文件名不正确。
5、找出长度小于5的单词
循环查找一下,每次循环都判断一下是否小于5。
if条件的参数:
-ne不等于;-ge大于等于;-le小于等于;lt小于(less than的缩写)