热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

shell循环_shell脚本编程学习之路分支与循环结构

1.if语句(1)if条件语句语法:单分支结构if[条件]then指令fi或if[条件];then指令fiif单分支条件中文编程形象语法:如果[你有房]

1.if语句

(1)if条件语句语法:单分支结构

if [ 条件 ]

then

指令

fi

if [ 条件 ];then

指令

fi

if 单分支条件中文编程形象语法:

如果 [ 你有房 ]

那么

我就嫁给你

果如

前面的文件条件表达式[ -f "$file1" ]&& echo 1 就相当于下面的if语句

if [ -f "$file1" ];then

echo 1

fi

(2)双分支结构

语法:

if [ 条件 ]

then

指令集1

else

指令集2

fi

上面的就相当于文件条件表达式[ -f "$file1" ]&&echo 1||echo 0

if双分支中文编程语法形象描述:

如果 [ 你有房 ]

那么

我就嫁给你

否则

Goodbye

果如

(3)多分支结构

语法:

if [ 条件1 ]

then

指令1

elif [ 条件2 ]

then

指令2

else

指令3

fi

------------------------多个elif--------------------------

if [ 条件1 ]

then

指令1

elif [ 条件2 ]

then

指令2

elif [ 条件3 ]

then

指令3

…………

else

指令4

fi

多分支if语句中文编程语法形象描述:

如果 [ 你有房 ] <&#61;&#61;有钱

那么

我就嫁给你

或者如果[ 你爸是李刚 ] <&#61;&#61;有权

那么

我就嫁给你

或者如果[ 你很努力很吃苦 ]<&#61;&#61;有潜力

那么

我们可以先处对象

否则

不鸟你<&#61;&#61;遭淘汰

果如

2.范例

监控系统内存并报警企业案例脚本开发实战

问题&#xff1a;开发shell脚本判断系统剩余内存的大小&#xff0c;如果低于100M就邮件报警给管理员&#xff0c;并且加入系统定时任务每3分钟执行一次。

解答&#xff1a;重视问题的解决过程&#xff0c;第一步、第二部、第三部

实战操作&#xff1a;

(1)先把命令行条件取出来

[root&#64;shellbiancheng ~]# free -m

total used free sharedbuffers cached

Mem: 981123857 0 12 36

-/&#43; buffers/cache: 75 905

Swap: 1983 0 1983

[root&#64;shellbiancheng ~]# free -m|awk -F "[ ]&#43;" &#39;NR&#61;&#61;3{print $4}&#39;

906

(2)编写脚本&#xff0c;发送邮件。发送邮件常用的有mail或mutt&#xff1b;服务端有sendmail服务(Centos5)&#xff0c;postfix服务(Centos6默认)&#xff0c;本地常见的邮件服务有&#xff1a;

Centos5 默认使用sendmail邮件服务&#xff0c;开启方式/etc/init.d/sendmail start

Centos6默认使用postfix邮件服务&#xff0c;开启方式/etc/init.d/postfix start

这里不使用本地的邮件服务而是使用本地的mail客户端。以及第三方的邮件服务器商如&#xff1a;163(需要提前注册用户)利用这个邮件账号来接收报警人发送的邮件。发送smtp端口25&#xff0c;接收pop3端口110

[root&#64;linzhongniao ~]# tail -2 /etc/mail.rc

set from&#61;xxxxxxxx&#64;163.com smtp&#61;smtp.163.com

set smtp-auth-user&#61;xxxxx&#64;163.com smtp-auth-password&#61;xxxxxxxx smtp-auth&#61;login

[root&#64;linzhongniao ~]# cat free.sh

#!/bin/bash

export PATH&#61;"/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/passwd:/usr/bin/passwd:/root/bin"

cur_free&#61;"&#96;free -m|awk -F "[ ]&#43;" &#39;NR&#61;&#61;3{print $4}&#39;&#96;"

chars&#61;"current memory is $cur_free."

mails&#61;"/bin/mail"

if [ $cur_free -le 800 ];then

echo "$chars"|${mails} -s "一级告警" xxxxxxxxx&#64;163.com

fi

查看邮件室友发送成功在命令行用mailq命令

3.拓展:监控磁盘&#xff0c;NFS系统&#xff0c;MYSQL&#xff0c;WEB

(1)监控磁盘

先读取命令行然后再判断磁盘使用率是否低于设定的值&#xff0c;如果低于设定值发邮件报警。

[root&#64;localhost ~]# df -h

filesystemSize Used Avail Use% Mounted on

/dev/mapper/VolGroup-lv_root

18G 816M 16G 5% /

tmpfs 491M 0 491M 0% /dev/shm

/dev/sda1 477M 33M 419M 8% /boot

[root&#64;localhost ~]# df -h|awk -F "[ ]&#43;" &#39;NR&#61;&#61;3 {print $3}&#39;

16G

(2)监控mysql服务

可以根据mysql服务的端口存在不存在判断mysql是否启动

注意&#xff1a;不要将端口值取出来&#xff0c;wc –l统计端口个数就完事儿了&#xff0c;将问题简单化。

[root&#64;localhost ~]# netstat -lnt|grep 3306

tcp0 0 0.0.0.0:33060.0.0.0:* LISTEN

[root&#64;localhost ~]# netstat -lnt|grep 3306|wc -l

1

4.实战:

用if双分支实现对apache或mysql服务是否正常判断&#xff0c;使用进程数、端口、URL的方式中的一种&#xff1b;如果进程没启动&#xff0c;就把进程启动。

(1)使用端口判断mysql(本地)

[root&#64;localhost ~]# cat mysql.sh

#!/bin/bash

a&#61;$(netstat -lntup|grep mysql|wc -l)

echo $a

if [ "$a" -eq "1" ];then

echo "mysql is start"

else

echo "mysql is stop.starting "

/etc/init.d/mysqld start

fi

(2)使用端口判断apache(本地)

[root&#64;localhost ~]# cat apache.sh

#!/bin/bash

apache&#61;$(netstat -lntup|grep httpd|wc -l)

echo $apache

if [ "$apache" -eq "1" ];then

echo "apache is starting..."

else

echo "starting is not starting..."

/usr/local/apache/bin/apachectl start

fi

5.用if语句比较两个数的大小

[root&#64;localhost ~]# cat read3.sh

#!/bin/bash

read -p "please input nun1 num2:" a b

if [ "$a" -eq "$b" ];then

echo "$a 等于 $b"

elif [ "$a" -gt "$b" ];then

echo "$a 大于 $b"

elif [ "$a" -lt "$b" ];then

echo "$a 小于 $b"

fi

6.监控web和mysql服务

监控web服务和mysql服务是否正常&#xff0c;不低于5中思路&#xff0c;监控思路Web服务和mysql服务都适用。

(1)端口

本地&#xff1a;netstat/ss/lsof/ps

远程&#xff1a;telnet/nmap/nc 不在一台机器上

(2)进程(本地)ps –ef|grep mysql|wc -l

(3)wget/curl(http方式&#xff0c;判断数据返回值或者返回内容)

(4)header(http方式&#xff0c;根据状态码判断)

(5)数据库特有&#xff0c;通过mysql客户端连接&#xff0c;根据返回值或者返回内容判断。

6.1 监控mysql服务

6.1.1 本地

(1)netstat –lnup|grep 3306|wc –l

551db827973b18ff793ebaba8d8582e1.png

注意这个端口必须是唯一的&#xff0c;不唯一系统上的mysql端口是多少就写多少

(2)"netstat -lnt|grep 3306|awk -F "[ :]&#43;" &#39;{print $5}&#39;&#96;&#96;" &#61; "3306" 取值比较是否等于3306

(3)netstat –lntup|grep mysqld|wc –l 计算mysql服务的数量

(4)[ps -ef|grep mysql|grep -v grep|wc -l -gt 0 ]

查看mysql进程如果是多实例的话就不要grep mysql了&#xff0c;直接过滤它唯一值的那个端口的名字。

(6)ss -lntup|grep 3306|wc –l

(7)lsof -i :3306|grep mysql|wc –l 没有lsof命令可以yum安装

6.1.2 远程查看服务端口开启情况

查看远端端口一般很少使用telnet&#xff0c;推荐使用nmap查看远端端口的open的状态来确定端口是否有开启。如果没nmap用yum安装一下。端口开放服务不一定正常&#xff0c;端口不开服务一定不正常&#xff1b;所以当服务器数量比较多一般都会判断端口。生产环境中用的比较多的是nmap。

(1) nmap 192.168.1.113 -p 3306 2>/dev/null|grep open|wc –l

cb180c6f0ee0f1ce11443b164928909b.png

(2) echo -e ""|telnet 192.168.1.113 3306|grep Connected|wc -l

(3) nc -v -w 2 192.168.1.113 -z 3306 2>/dev/null |grep succeeded|wc –l

我们在执行nc -v -w 2 192.168.1.113 -z 3306这条命令是可能会出现这样的报错F?jHost &#39;192.168.1.108&#39; is not allowed to connect to this MySQL server。出现这个错误的原因是不允许远程访问mysql&#xff0c;所以我们要创建远程登录用户并授权。

ed5a6871611726dd117ddda489064fc7.png

6.1.3 总结查看mysql服务是否开启的方法

通过本地和远端查看端口判断服务的启停&#xff0c;如果服务没有启动就启动服务。一共七种方法&#xff0c;如下图所示。

aa9f2024d3abe41c85ecc1e5c912804f.png

6.2 监控web服务

mysql查看本地和远程端口的方法&#xff0c;web服务也同样适用。这里就不详细说明了&#xff0c;只说一下curl和wget两种方法。查看web服务是否开启的所有方法&#xff0c;如下图所示&#xff1a;

cba214227c9370a95bdb12c3809d5829.png

下图为用curl监控web服务的五种方法

2dc06c31d2230cef6e8d1ddf47b6487d.png

下面为wget监控web服务的方法

[root&#64;shellbiancheng ~]# cat check_web3.sh

#!/bin/sh

wget -T 10 -q --spider http://192.168.1.113 &>/dev/null

if [ $? -eq 0 ];then

echo "httpd is started"

else

echo "httpd is starting..... "

ssh -p 22 root&#64;192.168.1.113 &#39;/etc/init.d/httpd start&#39;

fi

6.3 小结

本地&#xff1a;ss&#xff0c;netstat&#xff0c;lsof&#xff0c;ps

&#96;netstat –lntup|grep mysqld|wc –l&#96;

&#96;ss -lntup|grep 3306|wc –l&#96;

&#96;lsof -i :3306|grep mysql|wc –l&#96;

ps -ef|grep mysql|grep -v grep|wc -l -gt 0

远程&#xff1a;telnet&#xff0c;nmap&#xff0c;nc&#xff0c;curl,wget

echo -e ""|telnet 192.168.1.113 3306|grep Connected|wc –l

nmap 192.168.1.113 -p 3306 2>/dev/null|grep open|wc –l 推荐使用

nc -v -w 2 192.168.1.113 -z 3306 2>/dev/null |grep succeeded|wc –l

header(http code)curl –I 监控web服务&#xff0c;web地址返回200就ok

curl -I -m 10 -o /dev/null -s -w "%{http_code}"



推荐阅读
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在Linux环境中,通过编写Shell脚本来实现自定义命令的创建与激活,能够极大地简化服务器上多个子系统的管理操作。例如,通过简单的命令如“tt”,即可快速查看各个应用程序的名称及其运行状态,从而提高系统维护的效率和便捷性。 ... [详细]
  • zabbix 自定义监控
    配置自定义监控,我们需要配置监控项的key,和监控项返回的value添加自定义监控key的格式,在配置文件中添加UserParameter ... [详细]
  • 10分钟带你搞定 Linux awk命令
    欢迎加入JackTian技术交流群!CSDN海量资源免费下载!简介awk是一个强大的文本分析工具,相对于grep的查找,se ... [详细]
  • Linux提权之suid篇
    Linux提权之suid篇不知攻,焉知防一个在安服路上摸索的大三生,记录平时学习笔记suid前言:1.只有可以执行的二进制程序文件才 ... [详细]
  • Shell脚本统计文件行数转自http:www.jb51.netarticle61943.htm示例:row_count.sh文件awk{printNR}row_co ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在本文中,我们将探讨如何在Docker环境中高效地管理和利用数据库。首先,需要安装Docker Desktop以确保本地环境准备就绪。接下来,可以从Docker Hub中选择合适的数据库镜像,并通过简单的命令将其拉取到本地。此外,我们还将介绍如何配置和优化这些数据库容器,以实现最佳性能和安全性。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 公司计划部署邮件服务器,考虑到已有域名,决定自行搭建内部邮件服务器。经过综合考量,最终选择在Linux环境中进行搭建,并记录了相关配置和实践过程。本文将详细介绍Postfix的基本设置步骤和实践经验,帮助读者快速掌握邮件服务器的搭建方法。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • Panabit应用层流量管理解决方案
    Panabit是一款国内领先的应用层流量管理解决方案,提供高度开放且免费的专业服务,尤其擅长P2P应用的精准识别与高效控制。截至2009年3月25日,该系统已实现对多种网络应用的全面支持,有效提升了网络资源的利用效率和安全性。 ... [详细]
  • awk if 包含_千面 awk | Linux 中国
    awk命令不仅提供了简单的输入字符串筛选功能,还包含提取数据列、打印简单文本、筛选内容——甚至做一些数学计算。--SandraHenry-stockerawk命令不仅 ... [详细]
  • 安装配置_安装配置MongoDB数据库
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了安装配置MongoDB数据库相关的知识,希望对你有一定的参考价值。   &n ... [详细]
author-avatar
米字格时光
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有