Linux中shell流程控制语句

一、if条件控制

1.1 语法解读

复制代码
单路决策 - 单分支if语句
	样式:
        if [ 条件 ]
        then
            指令
        fi
    特点:
    	单一条件,只有一个输出

双路决策 - 双分支if语句
	样式:
        if [ 条件 ]
        then
            指令1
        else
            指令2
        fi
    特点:
    	单一条件,两个输出

多路决策 - 多分支if语句
	样式:
		if [ 条件 ]
        then
            指令1
        elif [ 条件2 ]
        then
            指令2
        else
            指令3
        fi
	特点:
    	n个条件,n+1个输出

1.2 简单实践

实践1-单if实践

复制代码
[root@localhost ~]# vim sex.sh
#!/bin/bash
# 单分支if语句的使用场景

# 定制普通变量
gender="$1"

# 条件判断逻辑
if [ "${gender}" == "nan" ]
then
   echo "您的性别是 男"
fi

-- 测试
bash sex.sh nan

实践2-多if实践

复制代码
[root@localhost ~]# vim sex.sh
#!/bin/bash
# 多分支if语句的使用场景

# 定制普通变量
gender="$1"

# 条件判断逻辑
if [ "${gender}" == "nan" ]
then
   echo "您的性别是 男"
elif [ "${gender}" == "nv" ]
then
   echo "您的性别是 女"
else
   echo "您的性别,我不知道"
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} ]] 
then
    echo -e "\e[31m主机登录验证成功\e[0m"
else
    echo -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
do
  echo "列表元素: ${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}
do
  echo "列表元素: ${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-$i
    echo -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}
do
  let all_sum+=i
done

# 定制所有奇数求和逻辑
for i in {1..100..2}
do
  let 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++))
do
  let all_sum+=i
done

# 定制所有奇数求和逻辑
for ((i=1;i<=100;i+=2))
do
  let 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 ]
do
   echo -n "${a} "
   # 每输出一次数据,数据值+1
   a=$((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))
do
  let all_sum+=i
  let i++
done

# 定制所有奇数求和逻辑
i=1
while ((i<=100))
do
  let odd_sum+=i
  let 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
do
  wget --spider -T5 -q -t2 ${site_addr} && echo "${site_addr} 站点正常" || echo "${site_addr} 站点异常"
  sleep 1
done
相关推荐
求知若渴,虚心若愚。14 分钟前
Error reading config file (/home/ansible.cfg): ‘ACTION_WARNINGS(default) = True
linux·前端·ansible
π大星星️2 小时前
Nginx 四层(stream)反向代理 + DNS 负载均衡
运维·nginx·负载均衡
beyoundout2 小时前
HAproxy
linux·运维·服务器
qq_218753314 小时前
服务器查日志太慢,试试grep组合拳
运维·服务器
Jie_175 小时前
【linux】高可用集群Keepalived
linux·运维·服务器
思绪漂移5 小时前
阿里云【免费试用】Elasticsearch 智能运维 AI 助手
运维·elasticsearch·阿里云
aiprtem5 小时前
LVGL + ESP-Brookesia 嵌入式模拟桌面应用开发
linux·c语言·物联网
21号 16 小时前
4.应用层自定义协议与序列化
运维·服务器·网络
xx.ii7 小时前
4.Linux 应用程序的安装和管理
linux·服务器·网络
奋斗的蛋黄8 小时前
解析分区、挂载与块设备:Linux 存储管理核心命令详解
linux·服务器·网络