linux流程控制-if语句;case ..... esac 判断;function函数
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 1月 6 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
书山有路勤为径,学海无涯苦作舟