温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Shell编程之if语句的示例分析

发布时间:2021-06-10 11:22:05 来源:亿速云 阅读:336 作者:小新 栏目:开发技术

这篇文章给大家分享的是有关Shell编程之if语句的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、if条件语句

1、单分支语句结构

第一种语法如下:

if <条件表达式> 
 then 
 指令 
fi

第二种语法

if <条件表达式>; then 
 指令 
fi

在以上这两种方式中我还是喜欢用第一种,这个是看个人习惯的。在上面的两个语法中<条件表达式>可以是 test [] [[]] (())等条件表达式,甚至可以使用命令作为条件表达式。注意:每个if语句都是以if开头 fi结束,中间并带有then;

其实很简单,举个例子如下:

if [ -f file ] 
 then 
 echo "是一个普通文件" 
 else 
 echo "不是一个普通文件" 
 exit 1 
fi

剖析:如果file是一个普通文件,那么就执行echo "是一个普通文件"  否则 输出一条"不是一个普通文件" 最后退出脚本

其实以下的这段命令更能清晰的了解if语句如下:

如果 <你不会if语句> 
 那么 
 那肯定长的不帅 
果如

2、以上就是单分支的if语句,接下来看看双分支的if语法结构

if <条件表达式> 
 then 
 指令一 
 else 
 指令二 
fi

以上就是单分支的if语句结构,那么在举个例子如下:

if [ -f file ] 
 then 
 echo "这是一个普通文件" 
 else 
 echo "NONONO" 
fi

这个和以上的例子是一样的。同样是测试file是不是一个普通文件,如果是,那么就输出指令1 否则那么就输出指令2

到这里我们在来一个形象描述

如果 <你不会if语句> 
 那么 
  就快点学,快点练 
 否则 
  你永远都不可能学会 
果如

我们发现 单分支和双分支的区别就在于一个有else 一个没有。

3、多分支if语句结构

我们在上面说了 单分支和双分支 这里又有了一个多分支,我们可以理解为双分支里面包含了单分支,那么多分支里面肯定包含了单分支+双分支:个人理解,好像有点绕? 先来看看多分支吧 如下:

if 语句多分支结构主体为:如果.....那么....否则如果.....那么.....否则如果.....那么,,,,

例1:

if [ -f file ] 
 then 
 echo "yes yes yes" 
elif [ -z file ] 
 then 
 echo "yes yes" 
else 
 echo "nonono" 
fi

解释如下图:

Shell编程之if语句的示例分析

看完图还是没理解? 没有关系 如下:

Shell编程之if语句的示例分析

到这里应该是没有问题了~~

单分支if条件语句实践

把下面的测试文件中条件表达式改为if条件语句

[root@shell-yankerp sh]# [ -f file ] && echo "yes" || echo "no" 
yes

修改如下:

if [ -f file ] 
 then 
 echo "yes" 
 else 
 echo "no" 
fi

运行结果如下:

[root@shell-yankerp sh]# [ -f file ] && echo "yes" || echo "no" 
yes 
[root@shell-yankerp sh]# sh cs.sh 
yes 
[root@shell-yankerp sh]# cat cs.sh 
#!/bin/bash 
# Maintenance:<ywyankerp@163.com> 
# BINLOG:www.ywyankai.cn 
# DATE:03:31:35 CST, Sunday, 02 month, 2018, 04 
# Test scripts 
 
if [ -f file ] 
 then 
 echo "yes" 
 else 
 echo "no" 
fi 
[root@shell-yankerp sh]#

到这里if的一些基本语法应该掌握了,那么我们接下来,来点实际的。

实战1:开发shell脚本检测Nginx服务是否正常启动 如果宕机,那么就设置邮箱报警!!!

其实此章有很多的案例,但是还是那句话,我还是想用我的思想来编写整个脚本,这样能表达出来我的整个过程!

首先我们要知道为什么要写这个脚本?,我们的目的是要干什么?最后需要实现什么样的效果?,写了这个脚本到底能实现什么样的功能? 我感觉这个是我们首先需要考虑的问题。随后我们就可以带着这些问题,去编写我们的shell脚本

那么我们可以根据以上的需求分为三块 如:如何查看Nginx服务是否启动?  我们如何查看Nginx服务宕机时候的一些情况。 最后我们需要知道我们用什么样的工具来实现这个邮箱报警。

1、如何查看Nginx启动?

我们可以通过netstat -anput | grep nginx 来查看Nginx是否启动如下:

Shell编程之if语句的示例分析

首先通过上图我们得到的信息是:我们可以通过上面那条命令来查看,那么接下来我们肯定是需要写在脚本中的,通过我们的if条件测试语句来写,最后我们进行比较,所以这时候我们最好的方法是提取它的行号,如下:

Shell编程之if语句的示例分析

也就是说 使用wc -l这个命令可以知道它的行号,只有一行 所以显示1,那么我们来关闭Nginx再次查看

Shell编程之if语句的示例分析

当我们关闭Nginx时 它已经没有80端口以及Nginx服务名的一些信息了,所以显示0 那么我们现在又能得出一个结论,如果 netstat -anput | grep nginx | wc -l 输出的为1 那么Nginx是启动的 输出的为0 那么Nginx已经停止运行;

到这里我们的两个信息已经知道了:如何查看Nginx服务是否启动?  我们如何查看Nginx服务宕机时候的一些情况。

那么就接下来就剩下邮件告警了,我们可以使用sendmail来实现,安装如下:

1.安装相关的依赖包

[root@shell-yankerp sh]# yum install perl-Net-SSLeay perl-IO-Socket-SSL -y

2.解压并安装

[root@shell-yankerp ~]# tar zxf sendEmail-v1.56.tar.gz 
[root@shell-yankerp ~]# cd sendEmail-v1.56/ 
[root@shell-yankerp sendEmail-v1.56]# cp sendEmail /usr/local/bin/sendEmail

到这里我们先发个邮件试试,确保邮件可以发送

代码如下:


[root@shell-yankerp ~]# /usr/local/bin/sendEmail -f yankerpcs@163.com -t ywyankerp@163.com -s smtp.163.com -u "Nginx测试" -o message-content-type=html -o message-charset=utf8 -xu yankerpcs -xp ******* -m "Nginx正在测试" 

Shell编程之if语句的示例分析

这边我已经收到了邮件报警测试的邮件了

3、接下来就可以开始写脚本了如下:

#!/bin/bash 
# Maintenance:<ywyankerp@163.com> 
# BINLOG:www.ywyankai.cn 
# DATE:03:31:35 CST, Sunday, 02 month, 2018, 04 
# Test scripts 
 
NX=`netstat -anput | grep nginx | wc -l` 
 
if [ "$NX" -eq 0 ] 
 then 
  /usr/local/nginx/sbin/nginx 
fi 
 
if [ "$?" -ne 0 ] 
 then /usr/local/bin/sendEmail -f yankerpcs@163.com -t ywyankerp@163.com -s smtp.163.com -u "Nginx报警" -o message-content-type=html -o message-charset=utf8 -xu yankerpcs -xp ******* -m "Nginx启动失败尽快查 
看!!!" &> /dev/null 
fi

在这里我会一条条的解释:

NX=`netstat -anput | grep nginx | wc -l`  :这就是上面测试的那条命令,如果Nginx宕机就输出0 正常运行那么就输出1 来确定Nginx运行状况赋值给了变量NX

if [ "$NX" -eq 0 ]     //如果NX执行的结果为0 
 then          //那么
  /usr/local/nginx/sbin/nginx  //启动nginx服务
fi

最后结束符fi

if [ "$?" -ne 0 ]
 then /usr/local/bin/sendEmail -f yankerpcs@163.com -t ywyankerp@163.com -s smtp.163.com -u "Nginx报警" -o message-content-type=html -o message-charset=utf8 -xu yankerpcs -xp ****** -m "Nginx启动失败尽快查
看!!!" &> /dev/null
fi

当我们启动Nginx启动失败时 我们在这里使用特殊的状态变量$? 查看上一条命令是否为0 是0就是成功。解释:如果启动Nginx失败,那么就会执行 /usr/local/bin.....就是这个邮箱报警程序 输出一条 Nginx启动失败尽快查看!!!

最后的脚本是这样的 如下:

Shell编程之if语句的示例分析

那么接下来我们执行:

1.首先我们模拟Nginx宕机,随后运行脚本

Shell编程之if语句的示例分析

在第一条命令我们可以看到nginx没有启动 当我们运行脚本它检测到了Nginx宕机后就会执行启动操作是以下语句实现的如下:

NX=`netstat -anput | grep nginx | wc -l` 
 
if [ "$NX" -eq 0 ] 
 then 
  /usr/local/nginx/sbin/nginx 
fi

2、我们尝试修改Nginx的启动路径,故意出现Nginx启动失败的情节,来测试邮箱是否能够正常接收

Shell编程之if语句的示例分析

修改完成后运行此脚本

Shell编程之if语句的示例分析

实现此效果的脚本段如下:

if [ "$?" -ne 0 ] 
 then /usr/local/bin/sendEmail -f yankerpcs@163.com -t ywyankerp@163.com -s smtp.163.com -u "Nginx报>警" -o message-content-type=html -o message-charset=utf8 -xu yankerpcs -xp ****** -m "Nginx启动失败尽>快查看!!!" &> /dev/null 
fi

随后我们添加计划任务 每1分钟执行一次脚本

Shell编程之if语句的示例分析

其实到这里我们的一个实例就结束了,虽然这表面上是一个实例,但是MySQL PHP? SSHD这些各种服务的检测脚本那么肯定是没有任何的问题了,包括检测磁盘空间的占用情况等等,都是可以举一反三的,在这里我就不在演示了。 

感谢各位的阅读!关于“Shell编程之if语句的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI