当前位置: 首页 > ds >正文

Linux中shell流程控制语句

一、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

http://www.xdnf.cn/news/13205.html

相关文章:

  • 【为什么RabbitMQ能够控制事务?控制事务的原理】
  • DAY 49 CBAM注意力
  • C++ 类基础:封装、继承、多态与多线程模板实现
  • Python开发基础手语识别(基础框架版)
  • Ansible 错误处理:确保高效自动化
  • 【工具】Configurable-HTTP-Proxy 使用指南
  • 倒装芯片凸点成型工艺
  • TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
  • 相关类相关的可视化图像总结
  • Polarr:手机修图,专业与创意并存
  • 数据库管理与高可用-MySQL故障排查与生产环境优化
  • 一种新的编程语言,这种新编程语言叫做『人类语言』
  • 基于大模型预测原发性急性闭角型青光眼的技术方案研究大纲
  • Django RBAC项目后端实战 - 03 DRF权限控制实现
  • 无菌药厂通信架构升级:MODBUS TCP转CANopen技术的精准控制应用
  • 云原生时代的系统设计:架构转型的战略支点
  • Electron简介(附电子书学习资料)
  • 什么是日内融?日内融交易系统开发全解析
  • 第三方检测:软件渗透测试
  • 视觉slam--框架
  • 如何将联系人从 iPhone 转移到 Android
  • linux中如何在日志里面检索nowStage不等于1的数据的指令
  • 视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
  • Java解析前端传来的Unix时间戳
  • Vue 自动导入函数和变量插件 unplugin-auto-import
  • MySQL故障排查、生产环境优化与存储引擎MyISAM和InnoDB
  • 什么是TRS收益互换?金融创新架构下的交易系统开发与实践
  • MacBook pro 修改Homebrew 为中国源
  • [Java恶补day20] 54. 螺旋矩阵
  • 互联网大厂Java求职面试:云原生与微服务架构的深度探讨