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

Shell 编程中的流程控制:从基础到实践

一、Shell 编程逻辑概述

在 Shell 编程中,程序的执行逻辑主要分为三种基本类型:

  • 顺序执行:按照代码书写顺序从上到下执行
  • 选择执行:根据条件判断选择不同的执行路径
  • 循环执行:在满足条件时重复执行特定代码块

默认情况下,Shell 脚本中的命令按顺序执行,但在实际应用中,我们需要更灵活的逻辑控制。Shell 提供了一系列结构化命令来实现这些逻辑,包括条件判断语句(if、case、select)和循环语句(for、while、until)。


二、条件判断语句:if 结构

2.1 if 语句基础语法

if 语句是 Shell 中最基本的条件判断结构,支持单分支、双分支和多分支形式:

# 单分支 if
if [ 条件 ]; then指令
fi# 双分支 if-else
if [ 条件 ]; then指令1
else指令2
fi# 多分支 if-elif-else
if [ 条件1 ]; then指令1
elif [ 条件2 ]; then指令2
else指令3
fi

2.2 实践案例:服务管理脚本

下面是一个实用的服务管理脚本,通过 if 语句实现对服务的启动、停止和重启操作:

#!/bin/bash
# 功能:服务管理脚本
service_ops="$1"# 检查参数是否正确
if [ $# -ne 1 ]; thenecho "脚本使用方式: $0 [start|stop|restart]"exit 1
fi# 服务操作逻辑
if [ "$service_ops" == "start" ]; thenecho "服务启动中..."
elif [ "$service_ops" == "stop" ]; thenecho "服务关闭中..."
elif [ "$service_ops" == "restart" ]; thenecho "服务重启中..."
elseecho "无效参数,请使用 start|stop|restart"
fi

执行效果:

$ ./service_manager.sh start
服务启动中...$ ./service_manager.sh stop
服务关闭中...$ ./service_manager.sh invalid
无效参数,请使用 start|stop|restart

2.3 高级用法:嵌套 if 与扩展测试

Shell 支持在 if 语句中使用嵌套结构和扩展测试表达式:

#!/bin/bash
# 功能:监控异常处理脚本
monitor_type=("研发" "测试" "运维")
error_level=("红灯" "黄灯" "绿灯" "灰灯")read -p "请输入问题标识(1-3): " monitor_id# 检查问题类型有效性
if [ ${#monitor_type[@]} -lt $monitor_id ]; thenecho "无效标识,请输入正确的问题标识"
else# 问题类型处理case ${monitor_type[$monitor_id-1]} in"运维")echo "-----------请选择故障级别-----------"echo "1: 红灯 2: 黄灯 3: 绿灯 4: 灰灯"read -p "请输入故障级别: " level_id# 故障级别处理if [ ${#error_level[@]} -ge $level_id ]; thencase ${error_level[$level_id-1]} in"红灯")echo "请按照紧急故障性质进行处理";;# 其他级别处理...esacelseecho "无效的故障级别"fi;;# 其他类型处理...esac
fi

三、多分支选择:case 语句

当需要处理多个互斥条件时,case 语句比多层 if-elif 更清晰易读:

case 变量名 in值1)指令1;;值2)指令2;;*)默认指令;;
esac

3.1 实践案例:脚本管理平台

下面是一个脚本管理平台的案例,使用 case 语句实现不同环境脚本的分类展示:

#!/bin/bash
# 功能:脚本管理平台
env_array=("os" "web" "sql" "storage" "other")echo "        欢迎使用脚本管理平台"
echo "-----------请选择功能场景-----------"
echo " 1: 系统环境下脚本"
echo " 2: web环境下脚本"
echo " 3: 数据库环境下脚本"
echo " 4: 存储环境下脚本"
echo " 5: 其他环境下脚本"
echo "----------------------------------"read -p "请输入功能标识: " env_idcase "${env_array[$env_id-1]}" in"os")echo "系统环境下脚本文件有:"ls os;;"web")echo "web环境下脚本文件有:"ls web;;# 其他环境处理...*)echo "请输入有效的功能场景标识";;
esac

四、循环控制:for 语句

for 循环适用于已知次数的迭代操作,支持多种列表生成方式:

# 基础语法
for 变量 in 列表; do指令
done# 示例:遍历数字列表
for i in {1..5}; doecho "当前数字: $i"
done

4.1 实践案例:批量操作与统计

4.1.1 批量创建用户
#!/bin/bash
# 功能:批量创建用户
for i in {1..5}; douseradd "user-$i"echo "用户 user-$i 创建成功"
done
4.1.2 网段主机扫描
#!/bin/bash
# 功能:网段主机存活检测
netsub="192.168.1"
net_file="/tmp/host.txt"# 清空文件
> "$net_file"# 检测主机状态
for ip in {1..254}; dohost_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 "${netsub}.0 网段主机存活情况"
echo "------------------------------------"
echo "存活主机数量: ${live_num}"
echo "异常主机数量: ${unlive_num}"

4.2 高级用法:(()) 循环

双括号 (()) 语法支持更灵活的数值运算和循环控制:

#!/bin/bash
# 功能:计算1到100的和
all_sum=0
for ((i=1; i<=100; i++)); do((all_sum += i))
done
echo "1到100的和: $all_sum"# 计算奇数和
odd_sum=0
for ((i=1; i<=100; i+=2)); do((odd_sum += i))
done
echo "1到100奇数和: $odd_sum"

五、条件循环:while 与 until

5.1 while 循环

while 循环在条件为真时持续执行:

#!/bin/bash
# 功能:持续检测网站状态
read -p "请输入待测试站点域名: " site_addrwhile true; dowget --spider -T5 -q -t2 "$site_addr" && echo "$site_addr 站点正常" || echo "$site_addr 站点异常"sleep 1  # 每秒检测一次
done

5.2 until 循环

until 循环在条件为假时持续执行,与 while 逻辑相反:

#!/bin/bash
# 功能:打印99乘法表
num1=9
until [ $num1 -eq 0 ]; donum2=1until [ $num2 -gt $num1 ]; doecho -e "$num1x$num2=$[num1*num2]\t\c"((num2++))doneecho  # 换行((num1--))
done

六、交互式循环:select 语句

select 语句用于创建交互式菜单,常与 case 结合使用:

#!/bin/bash
# 功能:软件安装菜单
PS3='请选择软件序号: '
soft_name=("Nginx" "Apache" "Tomcat")echo "您需要安装的Web软件是?"
select soft in ${soft_name[@]}; docase $soft in"Nginx")echo "开始安装 Nginx 软件环境..."break;;"Apache")echo "开始安装 Apache 软件环境..."break;;"Tomcat")echo "开始安装 Tomcat 软件环境..."break;;*)echo "您输入的是无效信息,再来一次!!!"break;;esac
done

相关文章:

  • 阿里巴巴ROLL:大规模强化学习优化的高效易用解决方案
  • 当SAP系统内计划订单转换为生产订单时发生了什么?
  • Android启动时长优化(kernel部分)
  • 蓝牙音乐(A2DP)音频延迟的一些感想跟分析,让你对A2DP体验更佳深入
  • 什么是预训练?深入解读大模型AI的“高考集训”
  • 获取环境变量的两种方式:getenv()和environ
  • 元器件基础学习笔记——结型场效应晶体管 (JFET)
  • 打卡46天
  • 不要调用 TOARRAY() 从 LARAVEL COLLECTION 中获取所有项目
  • 【Linux】shell中的运行流程控制
  • 平面方程在不同坐标系下的变换与平移
  • Ubuntu 配置使用 zsh + 插件配置 + oh-my-zsh 美化过程
  • TongWeb7.0动态密钥说明
  • 设计一个算法:删除非空单链表L中结点值为x的第一个结点的前驱结点
  • 【LLM】fast-api 流式生成测试
  • 计算机是如何⼯作的
  • Day15
  • 长期施肥下红壤温湿度及电导率数据集
  • 【HarmonyOS 5】运动健康开发实践介绍以及详细案例
  • 篇章十 数据结构——Java对象的比较
  • 恶意点击别人的网站/网站运营优化培训
  • 淘宝几百块钱做网站靠谱吗/西安关键词seo
  • 哪些是网站建设/品牌营销策划方案案例
  • 同时做网站建设和代账/哈尔滨网站推广
  • 俄罗斯网站域名注册/seo建站技巧
  • 湖南省人民政府网站集约化建设/全专业优化公司