【●】 循环结构
有时我们需要某个或者某群任务反复在服务器中执行很多次,就可以使用循环命令写成脚本,而无需手工一次次执行
一、for循环
1. 语句结构及特点
根据变量的不同取值,重复执行命令序列(有次数的循环)
for 变量名 in 值1 值2 值3 #此处变量名可以自定义,通常习惯用i,值的多少决定了下面do与done之间的任务执行多少次,每个值之间有空格,这里是有3个值,所以就循环执行指令3次
do
循环任务
done
--------------------------------------
#!/bin/bash
for i in {1..100} #执行100次任务的简略写法,但不支持变量
do
echo ${i}abc
done
#!/bin/bash
a=100
for i in $(seq $a)
do
echo ${i}abc
done
-------------------------------------
#!/bin/bash
a=100
for i in $(seq $a) //使用seq支持变量
do
echo ${i}abc
done
---------------------------------
编写脚本,用ping命令测试192.168.4.1~192.168.4.15是否可以通
#!/bin/bash
for i in {1..15}
do
ping -c 4 -i 0.2 -W 1 192.168.4.$i &> /dev/null
if [ $? -eq 0 ]; then
echo "192.168.4.$i 通了!"
else
echo "192.168.4.$i 不通!"
fi
done
------------------------------------------------------
改良版:
#!/bin/bash
x=0
y=0
for i in {1..15}
do
ping -c 4 -i 0.2 -W 1 192.168.4.$i &> /dev/null
if [ $? -eq 0 ]; then
echo "192.168.4.$i 通了!"
let x++
else
echo "192.168.4.$i 不通!"
let y++
fi
done
echo "$x台通了,$y台不通"
-----------------------------------------------------------------------
二、while循环
1. 语句结构及特点
反复测试条件,只要成立就执行命令序列,可以根据条件循环次数
如果条件测试成功,就执行下面的指令,然后再回来继续看条件测试能否成功,如果成功就继续 执行指令,且可以实现无限循环,一旦发现条件测试失败了,就立刻终止循环
while 条件测试
do
命令序列
done
#!/bin/bash
while [ 1 -eq 1 ] #故意写一个永远正确的条件测试可以实现无限循环
do
echo abc
sleep 0.2 #如果系统执行任务消耗CPU比较多,可以每次稍微休息0.2秒
done
----------------------------------------------------------------------
【●】case语句
一、case分支结构
1.语法结构及特点(功能类似于if,编写时语句比if精简)
● 检查变量的实际取值
—如果与预设的值相匹配,则执行对应的操作
case 变量值 in #如果调用的变量内容与下面某个模式一致,就执行模式下面的指令
模式1) #模式可以有很多
命令序列1;; #指令需要用双分号结尾,如果一个模式有多个指令,那只需在该模式的最后一条指令后加双分号即可
模式2)
命令序列2;;
·· ··
*)
默认命令序列
esac
或
case 调用变量的名称 in #如果调用的变量内容与下面某个模式一致,就执行模式下面的指令
模式1) #模式可以有很多
执行指令;; #指令需要用双分号结尾,如果一个模式有多个指令,那只需在该模式的最后一条指令后加双分号即可
模式2)
执行指令;;
·· ··
*)
执行指令
esac
----------------------------------------------
[root@svr7 opt]# vim test02.sh
#!/bin/bash
case $1 in
a)
echo 123;;
b)
echo 456;;
*)
echo "请输入a或b"
esac
[root@svr7 opt]# vim test02.sh
[root@svr7 opt]# bash test02.sh c
请输入a或b
[root@svr7 opt]# bash test02.sh a
123
[root@svr7 opt]# bash test02.sh b
456
------------------------------------------------
[root@svr7 opt]# vim test02.sh
#!/bin/bash
case $1 in
t) #如果$1是t就执行touch任务
touch $2;;
m) #如果$1是m就执行mkdir任务
mkdir $2;;
r) #如果$1是r就执行rm任务
rm -rf $2;;
*)
echo "请输入t或m或r"
esac
[root@svr7 opt]# bash test02.sh t abc
[root@svr7 opt]# ls
abc test01.sh test02.sh
[root@svr7 opt]# bash test02.sh m abcd
[root@svr7 opt]# ls
abc abcd test01.sh test02.sh
[root@svr7 opt]# bash test02.sh r abcd
[root@svr7 opt]# bash test02.sh r abc
[root@svr7 opt]# ls
test01.sh test02.sh
------------------------------------------------------------------------------------------------
二、编写部署软件脚本
1. 一键安装Nginx
— 一键源码安装Nginx软件
— 脚本自动安装相关软件的依赖包
— 脚本自动判断yum是否可用
● 配置nginx服务,nginx与httpd一样也是网站服务,但安装和使用方式有所不同编写脚本, 安装nginx
◆ 释放软件包
[root@svr7 ~]# tar -xf lnmp_soft.tar.gz #释放软件包
[root@svr7 ~]# cp lnmp_soft/nginx-1.17.6.tar.gz /opt #拷贝nginx到opt下
[root@svr7 ~]# cd /opt
[root@svr7 opt]# vim test03.sh
#!/bin/bash
yum -y install gcc make pcre-devel openssl-devel # 安装依赖
tar -xf nginx-1.17.6.tar.gz #释放nginx的tar包
cd nginx-1.17.6 #进入nginx目录
./configure #配置
make #编译
make install #安装
[root@svr7 opt]# bash test03.sh
[root@svr7 opt]# ls /usr/local/nginx #脚本执行完毕后查看
[root@svr7 opt]# systemctl stop httpd #关闭之前网站服务
[root@svr7 opt]# /usr/local/nginx/sbin/nginx #开启nginx
[root@svr7 opt]# systemctl stop firewalld #关闭防火墙
使用浏览器访问虚拟机地址,比如http://192.168.4.7 看到欢迎字样即可
-----------------------------------------------------------------------------------
2. 使用case分支编写脚本,用来控制nginx服务
#!/bin/bash
case $1 in //使用执行脚本后的第1个位置变量作为匹配对象
start|kai|k) //如果$1是start|kai|k中的任意一个就执行下面命令
/usr/local/nginx/sbin/nginx;; //开服务
stop|guan) //如果$1是stop|guan中的任意一个就执行下面命令
/usr/local/nginx/sbin/nginx -s stop;; //关服务
restart|cq) //如果$1是restart|cq中的任意一个就执行下面命令
/usr/local/nginx/sbin/nginx -s stop //先关闭
/usr/local/nginx/sbin/nginx;; //再开启,相当于重启服务
cha|status)
netstat -ntulp | grep -q nginx
[ $? -eq 0 ] && echo "nginx正在运行。。。" || echo "nginx未开启。。。";;
*)
echo "请输入start|stop|restart"
esac
----------------------------------------------------------------------
3. netstat 命令可以查询系统启动的端口信息
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)