24 shell编程 流程控制-if语句; case ..... esac 判断;函数function;判断磁盘使用率脚本;备份数据脚本;检测端口脚本 linux 如何判断服务是否启动

在这里插入图片描述

if… then

结合前面的条件判断;很容易了解流程控制 语句。

if [ 条件判断式 ]; then
	当条件判断式成立时,可以进行的命令工作内容;
fi
或者
if [ 条件判断式 ]
then
	当条件判断式成立时,可以进行的命令工作内容;
fi

多条件判断逻辑&& ||

  • && 代表 AND ;
  • || 代表 or ;
[ "$yn" == "Y" -o "$yn" == "y" ]
可替换为
[ "$yn" == "Y" ] || [ "$yn" == "y" ]
if [ 条件判断式1 -o 条件判断2]; then
	当条件判断式1和2有一个成立时,可以进行的命令工作内容;
fi
可替换为
if [ 条件判断式1 ] || [ 条件判断2]; then
	当条件判断式1和2有一个成立时,可以进行的命令工作内容;
fi

if…else…

# 一个条件判断,成功进行then  失败进行 else
if [ 条件判断式 ]; then
	当条件判断式成立时,可以进行的命令工作内容;
else
	当条件判断式不成立时,可以进行的命令工作内容;
fi

if … elif … elif … else

# 多个条件判断 (if ... elif ... elif ... else) 分多种不同情况运行
if [ 条件判断式一 ]; then
	当条件判断式一成立时,可以进行的命令工作内容;
elif [ 条件判断式二 ]; then
	当条件判断式二成立时,可以进行的命令工作内容;
else
	当条件判断式一与二均不成立时,可以进行的命令工作内容;
fi

判断磁盘使用率

[userwin@MiWiFi-R3L-srv sh]$ vim sdaRate.sh

#!/bin/bash
# 统计分区sda1的使用率
rate=$(df -h | grep "sda1" | awk '{print $5}' | awk 'BEGIN{FS="%"}{print $1}')
echo $rate
# $rate gt 80
if [ $rate > 80 ];then
        echo "sda1使用率已经超过80%;请及时清理......"
fi
[userwin@MiWiFi-R3L-srv sh]$ df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   18G  2.0G   16G   12% /
devtmpfs                 479M     0  479M    0% /dev
tmpfs                    489M     0  489M    0% /dev/shm
tmpfs                    489M  6.8M  483M    2% /run
tmpfs                    489M     0  489M    0% /sys/fs/cgroup
/dev/sda1                497M  107M  391M   22% /boot
tmpfs                     98M     0   98M    0% /run/user/1000
[userwin@MiWiFi-R3L-srv sh]$ sh sdaRate.sh 
22
sda1使用率已经超过80%;请及时清理......

可以shell文本 grep “sda1”$rate > 80的sda1、80 作为入参。

备份数据

[userwin@MiWiFi-R3L-srv sh]$ cat bakMysql.sh 
#!/bin/bash
# 备份mysql数据库文件

# 同步系统时间
#ntpdate asia.pool.ntp.org &>/dev/null

# 按照"年月日"格式获取当前系统日期
currDate=$(date +%y%m%d)

# 获取mysql文件夹的大小
size=$(du -sh /home/userwin/sh/mysql)

if [ -d /home/userwin/dbbak ]
	then
		echo "Date: $date!" >> /home/userwin/dbbak/dbinfo.log
		echo "Date size: $size" >> /home/userwin/dbbak/dbinfo.log
		cd /home/userwin/dbbak/
		tar -zcf mysql-db-$date.tar.gz /home/userwin/sh/mysql dbinfo.log &>>/dev/null
		rm -rf /home/userwin/dbbak/dbinfo.log
	else
		mkdir /home/userwin/dbbak
		echo "Date: $date!" >> /home/userwin/dbbak/dbinfo.log
                echo "Date size: $size" >> /home/userwin/dbbak/dbinfo.log
                cd /home/userwin/dbbak/
                tar -zcf mysql-db-$date.tar.gz /home/userwin/sh/mysql dbinfo.log &>>/dev/null
                rm -rf /home/userwin/dbbak/dbinfo.log
fi

生成dbbak文件夹了,如下:

[userwin@MiWiFi-R3L-srv dbbak]$ pwd
/home/userwin/dbbak
[userwin@MiWiFi-R3L-srv dbbak]$ ll
总用量 4
-rw-rw-r--. 1 userwin userwin 196 16 22:08 mysql-db-.tar.gz

检测端口

[userwin@MiWiFi-R3L-srv dbbak]$ netstat -tuln|grep tcp
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     
tcp6       0      0 ::1:6010                :::*                    LISTEN     
tcp6       0      0 ::1:6011                :::*                    LISTEN 
#封包格式           本地IP:端口       远程IP:端口       是否监听
[userwin@MiWiFi-R3L-srv sh]$ vim checkPort.sh 

#!/bin/bash
# 检查端口是否存在

testing=$(netstat -tuln | grep ":25")
if [ "$testing" != "" ];then
        echo "端口25存在"
fi

testing=$(netstat -tuln | grep ":80")
if [ "$testing" != "" ];then
        echo "端口80存在"
fi

[userwin@MiWiFi-R3L-srv sh]$ sh checkPort.sh 
端口25存在

case … esac 判断

case  $变量名称 in   <==关键字为 case ,还有变量前有钱字号
  "第一个变量内容")   <==每个变量内容建议用双引号括起来,关键字则为小括号 )
	程序段
	;;            <==每个类别结尾使用两个连续的分号来处理!
  "第二个变量内容")
	程序段
	;;
  *)                  <==最后一个变量内容都会用 * 来代表所有其他值
	不包含第一个变量内容与第二个变量内容的其他程序运行段
	exit 1
	;;
esac                  <==最终的 case 结尾!『反过来写』

函数function 功能

function fname() {
	程序段
}
function printit(){
	echo -n "Your choice is "     # 加上 -n 可以不断行继续在同一行显示
}

echo "This program will print your selection !"
case $1 in
  "one")
	printit; echo $1 | tr 'a-z' 'A-Z'  # 将参数做大小写转换!
	;;
  "two")
	printit; echo $1 | tr 'a-z' 'A-Z'
	;;
  "three")
	printit; echo $1 | tr 'a-z' 'A-Z'
	;;
  *)
	echo "Usage $0 {one|two|three}"
	;;
esac
function printit(){
	echo "Your choice is $1"   # 这个 $1 必须要参考底下命令的下达
}

echo "This program will print your selection !"
case $1 in
  "one")
	printit 1  # 请注意, printit 命令后面还有接参数!
	;;
  "two")
	printit 2
	;;
  "three")
	printit 3
	;;
  *)
	echo "Usage $0 {one|two|three}"
	;;
esac

函数案例,可以查看下文:
07 linux 一个完整的shell脚本调试工具

linux 如何判断服务是否启动

ps命令判断进程

ps判断并进程是否存在并不准确
当进程夯死时,服务并不能提供功能;但进程一直存在

# 判断httpd 服务是否启动
[root@MiWiFi-R3L-srv ~]# ps anx |grep httpd

#启动httpd  使用root用户
[root@MiWiFi-R3L-srv ~]# service httpd start
Redirecting to /bin/systemctl start  httpd.service
[root@MiWiFi-R3L-srv ~]# ps anx |grep httpd
  1817 ?        Ss     0:00 /usr/sbin/httpd -DFOREGROUND
  1818 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
  1819 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
  1820 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
  1821 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
  1822 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
  1824 pts/2    R+     0:00 grep --color=auto httpd

netstat命令判断端口是否已经被使用

netstat判断并进程是否存在并不准确
当进程夯死时,服务并不能提供功能;但进程一直存在

# 使用netstat 判断80端口是否存在
[root@MiWiFi-R3L-srv ~]# netstat -tlun
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:6012          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:6013          0.0.0.0:*               LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     
tcp6       0      0 ::1:6010                :::*                    LISTEN     
tcp6       0      0 ::1:6011                :::*                    LISTEN     
tcp6       0      0 ::1:6012                :::*                    LISTEN     
tcp6       0      0 ::1:6013                :::*                    LISTEN     
udp        0      0 0.0.0.0:514             0.0.0.0:*                          
udp        0      0 0.0.0.0:26163           0.0.0.0:*                          
udp        0      0 0.0.0.0:68              0.0.0.0:*                          
udp6       0      0 :::8922                 :::*                               
udp6       0      0 :::514                  :::* 
[root@MiWiFi-R3L-srv ~]# netstat -tlun|grep 80
tcp6       0      0 :::80                   :::*                    LISTEN     
[root@MiWiFi-R3L-srv ~]# service httpd stop
Redirecting to /bin/systemctl stop  httpd.service
[root@MiWiFi-R3L-srv ~]# netstat -tlun|grep 80
[root@MiWiFi-R3L-srv ~]#

nmap扫描工具

# 安装
[root@MiWiFi-R3L-srv ~]# yum -y install nmap
[root@MiWiFi-R3L-srv ~]# service httpd start
Redirecting to /bin/systemctl start  httpd.service

# nmap -sT 本机ip
[root@MiWiFi-R3L-srv ~]# nmap -sT 192.168.1.11

Starting Nmap 6.40 ( http://nmap.org ) at 2022-01-06 23:17 CST
Nmap scan report for 192.168.1.11
Host is up (0.00024s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
[root@MiWiFi-R3L-srv ~]# 

获取下图中红色行中state列的值
在这里插入图片描述

[root@MiWiFi-R3L-srv ~]# nmap -sT 192.168.1.11 | grep tcp
22/tcp open  ssh
80/tcp open  http
[root@MiWiFi-R3L-srv ~]# nmap -sT 192.168.1.11 | grep tcp | grep httpd 
[root@MiWiFi-R3L-srv ~]# nmap -sT 192.168.1.11 | grep tcp | grep http
80/tcp open  http
[root@MiWiFi-R3L-srv ~]# nmap -sT 192.168.1.11 | grep tcp | grep http | awk '{print $2}'
open
# 编写脚本判断http服务是否启动,未启动启动服务
state=$(nmap -sT 192.168.1.11 | grep tcp | grep http | awk '{print $2}')
if [ "$state" == "open" ];then
	echo "http 服务启动"
else
	/etc/rc.d/init.d/httpd start &>dev/null
fi

书山有路勤为径,学海无涯苦作舟

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EngineerForSoul

你的鼓励是我孜孜不倦的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值