一、if条件控制
1.1 语法解读
单路决策 - 单分支if语句样式:if [ 条件 ]then指令fi特点:单一条件,只有一个输出
双路决策 - 双分支if语句样式:if [ 条件 ]then指令1else指令2fi特点:单一条件,两个输出
多路决策 - 多分支if语句样式:if [ 条件 ]then指令1elif [ 条件2 ]then指令2else指令3fi特点:n个条件,n+1个输出
1.2 简单实践
实践1-单if实践
[root@localhost ~]# vim sex.sh
#!/bin/bash
# 单分支if语句的使用场景# 定制普通变量
gender="$1"# 条件判断逻辑
if [ "${gender}" == "nan" ]
thenecho "您的性别是 男"
fi-- 测试
bash sex.sh nan
实践2-多if实践
[root@localhost ~]# vim sex.sh
#!/bin/bash
# 多分支if语句的使用场景# 定制普通变量
gender="$1"# 条件判断逻辑
if [ "${gender}" == "nan" ]
thenecho "您的性别是 男"
elif [ "${gender}" == "nv" ]
thenecho "您的性别是 女"
elseecho "您的性别,我不知道"
fi-- 测试
bash sex.sh qwe
1.3 案例实践
堡垒机登录
[root@localhost ~]# vim blj.sh
#!/bin/bash
# 功能:定制堡垒机的展示页面
# 版本:v0.4
# 作者:书记
# 联系:www.superopsmsb.com# 定制普通变量
login_user='root'
login_pass='123456'# 堡垒机的信息提示
echo -e "\e[31m \t\t 欢迎使用堡垒机"
echo -e "\e[32m-----------请选择你要登录的远程主机-----------1: 1.14 (nginx)2: 1.15 (tomcat)3: 1.19 (apache)q: 使用本地主机
----------------------------------------------\033[0m"# 由于暂时没有学习条件判断,所以暂时选择 q
read -p "请输入您要选择的远程主机编号: " host_index
read -p "请输入登录本地主机的用户名: " user
read -s -p "请输入登录本地主机的密码: " password
echo
# 远程连接主机
if [[ ${user} == ${login_user} && ${password} == ${login_pass} ]]
thenecho -e "\e[31m主机登录验证成功\e[0m"
elseecho -e "\e[31m您输入的用户名或密码有误\e[0m"
fi-- 测试
bash blj.sh
二、case条件控制
1.1 语法解读
case 变量名 in值1)指令1;;...值n)指令n;;
esac
1.2 简单实践
案例需求
改造多分支if语句对脚本进行升级
要求脚本执行需要有参数,通过传入参数来实现不同的功能。参数和功能详情如下:
参数 执行效果
start 服务启动中...
stop 服务关闭中...
restart 服务重启中...
* 脚本 X.sh 使用方式 X.sh [ start|stop|restart ]
查看脚本内容
[root@localhost ~]# cat case.sh
#!/bin/bash
# 功能:定制服务管理的功能
# 版本:v0.1
# 作者:书记
# 联系:www.superopsmsb.com# 定制普通变量
service_ops="$1"# 脚本内容的判断
case "${service_ops}" in"start")echo -e "\e[31m服务启动中...\e[0m";;"stop")echo -e "\e[31m服务关闭中...\e[0m";;"restart")echo -e "\e[31m服务重启中...\e[0m";;"start")echo -e "\e[31m服务启动中...\e[0m";;*)echo -e "\e[31m$0 脚本的使用方式: $0 [ start | stop | restart ]\e[0m";;
esac
1.3 case实践
[root@localhost ~]# cat case.sh
#!/bin/bash
# 功能:定制服务管理的功能
# 版本:v0.1
# 作者:书记
# 联系:www.superopsmsb.com# 定制数组变量
env_array=(os web sql storage other)# 监控平台的信息提示
echo -e "\e[31m 欢迎使用脚本管理平台"
echo -e "\e[32m-----------请选择功能场景-----------1: 系统环境下脚本2: web环境下脚本3: 数据库环境下脚本4: 存储环境下脚本5: 其他环境下脚本
----------------------------------\033[0m"
# 定制业务逻辑
read -p "请输入功能标识: " env_id# 脚本内容的判断
case "${env_array[$env_id-1]}" in"os")echo -e "\e[31m系统环境下脚本文件有:\e[0m"ls os;;"web")echo -e "\e[31mweb环境下脚本文件有:\e[0m"ls web;;"sql")echo -e "\e[31m数据库环境下脚本文件有:\e[0m"ls sql;;"storage")echo -e "\e[31m存储环境下脚本文件有:\e[0m"ls storage;;"other")echo -e "\e[31m其他环境下脚本文件有:\e[0m"ls other;;*)echo -e "\e[31m请输入有效的功能场景标识\e[0m";;
esac
脚本执行效果
[root@localhost ~]# /bin/bash scripts_manager_case.sh
欢迎使用脚本管理平台
-----------请选择功能场景-----------
1: 系统环境下脚本
2: web环境下脚本
3: 数据库环境下脚本
4: 存储环境下脚本
5: 其他环境下脚本
----------------------------------
请输入功能标识: 6
请输入有效的功能场景标识
[root@localhost ~]# /bin/bash scripts_manager_case.sh 3
欢迎使用脚本管理平台
-----------请选择功能场景-----------
1: 系统环境下脚本
2: web环境下脚本
3: 数据库环境下脚本
4: 存储环境下脚本
5: 其他环境下脚本
----------------------------------
请输入功能标识: 3
数据库环境下脚本文件有:
sql-1.sh sql-2.sh sql-3.sh sql-4.sh sql-5.sh
三、for条件控制
1.1 语法解读
场景:遍历列表for 值 in 列表do执行语句done
1.2 简单实践
实践1-手工列表
查看脚本内容
[root@localhost ~]# cat for_hand_list.sh
#!/bin/bash
# 功能:手工列表 for循环
for i in yuwen shuxue lishi
doecho "列表元素: ${i}"
done脚本执行后效果
[root@localhost ~]# /bin/bash for_hand_list.sh
列表元素: yuwen
列表元素: shuxue
列表元素: lishi
实践2-定制列表
查看脚本内容
[root@localhost ~]# cat for_define_list.sh
#!/bin/bash
# 功能:定制列表 for循环
for i in {1..3}
doecho "列表元素: ${i}"
done脚本执行后效果
[root@localhost ~]# /bin/bash for_define_list.sh
列表元素: 1
列表元素: 2
列表元素: 3
1.3 for循环案例
批量实践1- 批量创建多个用户
查看脚本内容
[root@localhost ~]# cat for_add_user.sh
#!/bin/bash
# 功能:for批量创建用户# 定制批量创建用户的业务逻辑
for i in {1..5}
do# 创建用户useradd user-$iecho -e "\e[31m用户 user-$i 创建成功\e[0m"
done
批量实践2- 批量对特定网段的主机进行扫描
查看脚本内容
[root@localhost ~]# cat for_host_check.sh
#!/bin/bash
# 功能:for批量检测网段主机存活情况# 定制普通变量
netsub='192.168.66'
net_file='/tmp/host.txt'# 保证文件可用
[ -f ${net_file} ] && > ${net_file}# 定制批量检测网段主机状态逻辑
for ip in {1..254}
do# 测试主机连通性host_status=$(ping -c1 -W1 $netsub.$ip >/dev/null 2>&1 && echo "UP" || echo "DOWN")echo "$netsub.$ip 主机状态: $host_status" >> ${net_file}
done# 信息输出
live_num=$(grep UP ${net_file} | wc -l)
unlive_num=$(grep DOWN ${net_file} | wc -l)
echo -e "\e[31m${netsub}.0 网段主机存活情况\e[0m"
echo "------------------------------------"
echo -e "\e[32m${netsub}.0 网段存活主机数量: ${live_num}\e[0m"
echo -e "\e[32m${netsub}.0 网段异常主机数量: ${unlive_num}\e[0m"
赋值循环
查看脚本内容
[root@localhost ~]# cat for_odd_num.sh
#!/bin/bash
# 功能:for统计数据之和# 定制普通变量
all_sum=0
odd_sum=0# 定制所有数据求和逻辑
for i in {1..100}
dolet all_sum+=i
done# 定制所有奇数求和逻辑
for i in {1..100..2}
dolet odd_sum+=i
done# 信息输出
echo -e "\e[31m所有数据之和: ${all_sum}\e[0m"
echo -e "\e[31m所有奇数之和: ${odd_sum}\e[0m"脚本执行后效果
[root@localhost ~]# /bin/bash for_odd_sum.sh
所有数据之和: 5050
所有奇数之和: 2500
1.4 for (())案例
语法解读
在for循环的语法中,它还支持一种包含赋值+循环双功能的语法,也就是双小括号(()),这种语法的语法格式如下:样式1: 单元素样式for (( i=0; i<10; i++ ))样式2: 多元素样式for (( i=0,j=0; i<10; i++,j++ ))
实践1-(())简单使用
输出1-5的数字
[root@localhost ~]# for ((i=1;i<=5;i++));do echo $i;done
1
2
3
4
5输出1-10中的所有奇数
[root@localhost ~]# for ((i=1;i<=10;i+=2));do echo $i;done
1
3
5
7
9输出1-10中的所有偶数
[root@localhost ~]# for ((i=2;i<=10;i+=2));do echo $i;done
2
4
6
8
10
实践2-100个数字的求和
查看脚本内容
[root@localhost ~]# cat for_odd_num.sh
#!/bin/bash
# 功能:for统计数据之和# 定制普通变量
all_sum=0
odd_sum=0# 定制所有数据求和逻辑
for ((i=1;i<=100;i++))
dolet all_sum+=i
done# 定制所有奇数求和逻辑
for ((i=1;i<=100;i+=2))
dolet odd_sum+=i
done# 信息输出
echo -e "\e[31m所有数据之和: ${all_sum}\e[0m"
echo -e "\e[31m所有奇数之和: ${odd_sum}\e[0m"脚本执行后效果
[root@localhost ~]# /bin/bash for_odd_sum.sh
所有数据之和: 5050
所有奇数之和: 2500
四、while条件控制
1.1 语法简介
场景:只要条件满足,就一直循环下去while [ 条件判断 ]do执行语句done
1.2 简单实践
实践1-输出制定的范围数字
[root@localhost ~]# cat while_num_list.sh
#!/bin/bash
# 功能:while的输出5范围以内的数字# 定制初始变量值
a=1# 定制内容输出逻辑
while [ "${a}" -le 5 ]
doecho -n "${a} "# 每输出一次数据,数据值+1a=$((a+1))
done
echo
1.3 while案例
统计实践1- 计算1+2+...+100 的结果
查看脚本内容
[root@localhost ~]# cat while_odd_num.sh
#!/bin/bash
# 功能:while统计数据之和# 定制普通变量
all_sum=0
odd_sum=0# 定制所有数据求和逻辑
i=1
while ((i<=100))
dolet all_sum+=ilet i++
done# 定制所有奇数求和逻辑
i=1
while ((i<=100))
dolet odd_sum+=ilet i+=2
done# 信息输出
echo -e "\e[31m所有数据之和: ${all_sum}\e[0m"
echo -e "\e[31m所有奇数之和: ${odd_sum}\e[0m"脚本执行后效果
[root@localhost ~]# /bin/bash while_odd_num.sh
所有数据之和: 5050
所有奇数之和: 2500
实践2-持续检测网站存活
查看文件内容
[root@localhost ~]# cat while_site_healthcheck.sh
#!/bin/bash
# 功能:定制站点的检测功能
# 版本:v0.1
# 作者:书记
# 联系:www.superopsmsb.com# 定制普通变量
read -p "> 请输入待测试站点域名: " site_addr# 持久检测站点状态
while true
dowget --spider -T5 -q -t2 ${site_addr} && echo "${site_addr} 站点正常" || echo "${site_addr} 站点异常"sleep 1
done