1、 if条件语句
if条件语句,简单来说,其语义类似于汉语中的“如果...那么...”。if语句是Linux运维人员在实际生产过程中使用的最频繁也是最重要的语句。因此,务必重视if条件语句的知识,并牢固掌握。
1.1 单分支
1.1.1语法
\\第一种语法:
if <条件表达式>
then
指令
fi
\\第二种语法:
if <条件表达式>;then
指令
fi
1.1.2 逻辑流程图
1.1.3 if表达式嵌套
if单分支语句执行流程图的条件语句还可以嵌套(即if条件语句中还有if条件语句),注意每个if条件语句中都要有一个与之对应的fi(反if),每个if和它下面最近的fi成对搭配,语法如下所示:
if <条件表达式>;then
if <条件表达式>;then
指令
fi
fi
1.1.4 和之前条件表达式的关系
if条件语句相对于之前讲过的文件表达式[ -f “$file” ] && echo 1等价于下面的if语句
if [ -f “file”]; then
echo 1
fi
if条件语句的单分支,如果形象的使用中文解释的话,相当于一个女孩这么对你说:
如果 <你有房>;那么
我就嫁给你
果如
1.2 双分支
1.2.1 语法
if条件语句的单分支结构主体是“如果...那么...”,而if条件语句的双分支结构主体则为“如果...那么...否则...”。if条件语句的双分支结构语法为:
if<条件表达式>;then
指令集1
else
指令集2
fi
1.2.2 和之前条件表达式的关系
前文的文件测试表达式[ -f “file” ] && echo 1 || echo 0就相当于下面的双分支的if条件语句
if [ -f “file”]; then
echo 1
else
echo 0
fi
同样的,if条件语句的双分支,如果形象的使用中文解释的话,相当于一个女孩这么对你说:
如果 <你有房>;那么
我就嫁给你
否则
我再考虑一下
果如
1.2.3 逻辑流程图
1.3 多分支
if条件语句多分支结构主体为“如果...,那么...,否则如果...,那么... 否则如果...,那么...,否则”
3.1 语法
if条件语句多分支语法为:
if<条件表达式>;then
指令集1
elif <条件表达式>;then
指令集2
else
指令集3
fi
if条件语句的多分支,如果形象的使用中文解释的话,相当于一个女孩这么对你说:
如果 <你有房>;那么
我就嫁给你
或者如果 <你爸有背景>;那么
我也可以嫁给你
或者如果 <你很努力很吃苦>;那么
我们可以先谈谈男女朋友
否则
再见
果如
1.3.2 逻辑流程图
1.5 案例实操
1.5.1 判断nginx是否活着,如果没有活着就打印“邮件报警”(判断依据:curl/wget访问url)
1.5.2 利用自己编译的nginx,写一个nginx的启动脚本,需求如下:
- 类似于/etc/init.d/nginxd {start|stop|restart}
- 使用systemctl实现开机自启动管理
分析:
# 编译nginx
# 如果参数是start,则执行start的启动方式(/application/nginx/sbin/nginx)
# 如果参数是stop,则执行stop的关闭方式(/application/nginx/sbin/nginx –s stop)
# 如果stop的时候,没有进程,则输出一句话,"nginx 处于关闭状态"
# 如果是restart,则先执行stop,再执行start
[root@shell-project~]# cat /etc/init.d/nginxd
#!/bin/bash
# 定义变量
count=`netstat -lntup|grep nginx|wc -l`
#定义函数
function nginx_start(){
if [ $count -gt 0 ];then
echo 'nginx已经处于启动状态'
else
/application/nginx/sbin/nginx
echo 'nginx启动成功'
fi
}
function nginx_stop(){
if [ $count -eq 0 ];then
echo 'nginx已经处于关闭状态'
else
/application/nginx/sbin/nginx -s stop
echo 'nginx已关闭'
fi
}
# 如果参数是start,则执行start的启动方式(/application/nginx/sbin/nginx)
if [ "$1" = "start" ];then
nginx_start
# 如果参数是stop,则执行stop的关闭方式(/application/nginx/sbin/nginx –s stop)
# 如果stop的时候,没有进程,则输出一句话,"nginx 处于关闭状态"
elif [ "$1" = "stop" ];then
nginx_stop
# 如果是restart,则先执行stop,再执行start
elif [ "$1" = "restart" ];then
nginx_stop
sleep 2
nginx_start
echo 'nginx重启成功'
else
echo '参数错误,正确的参数是{start|stop|restart}'
fi
[root@shell-project~]#
[root@shell-project ~]# cat /usr/lib/systemd/system/nginx_wenjuan.service
[Unit]
Description=nginx service
After=nginx_wenjuan.target
[Service]
Type=forking
ExecStart=/etc/init.d/nginxd start
ExecReload=/etc/init.d/nginxd restart
ExecStop=/etc/init.d/nginxd stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@shell-project ~]#
[root@shell-project ~]# chmod +x /etc/init.d/nginxd
[root@shell-project ~]# systemctl start nginx_wenjuan.service
[root@shell-project /application]# systemctl status nginx_wenjuan
● nginx_wenjuan.service - nginx service
Loaded: loaded (/usr/lib/systemd/system/nginx_wenjuan.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2019-07-18 00:27:52 CST; 2s ago
Process: 11715 ExecStop=/etc/init.d/nginxd stop (code=exited, status=0/SUCCESS)
Process: 11724 ExecStart=/etc/init.d/nginxd start (code=exited, status=0/SUCCESS)
Main PID: 11730 (nginx)
CGroup: /system.slice/nginx_wenjuan.service
├─11730 nginx: master process /application/nginx-1.16.0/sbin/nginx
└─11731 nginx: worker process
Jul 18 00:27:52 shell-project systemd[1]: Stopped nginx service.
Jul 18 00:27:52 shell-project systemd[1]: Starting nginx service...
Jul 18 00:27:52 shell-project nginxd[11724]: nginx启动成功
Jul 18 00:27:52 shell-project systemd[1]: Started nginx service.
[root@shell-project /application]#