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

Shell流程结构

Shell 流程控制结构总结笔记


一、Shell 流程结构概述

Shell 脚本支持三种基本流程结构:

  • 顺序结构:从上到下逐行执行。
  • 选择结构(分支):根据条件判断执行不同代码块,如 ifcase
  • 循环结构:重复执行一段代码,如 forwhile

二、if 选择结构

1. 基本形式

(1)单分支

if [ condition ]; thencommand
fi
# 或简写
[ condition ] && command

(2)双分支

if [ condition ]; thencommand1
elsecommand2
fi
# 或简写
[ condition ] && command1 || command2

(3)多分支

if [ cond1 ]; thencmd1
elif [ cond2 ]; thencmd2
elsecmd3
fi

✅ 注意:每个 if/elif 后必须有 then,否则报错。


2. 实用案例

  • 年龄判断

    read -p "请输入年龄:" age
    if [ $age -ge 18 ]; thenecho "已成年"
    elseecho "未成年"
    fi
    
  • 磁盘使用率告警

    disk_usage=$(df / | grep / | tr -s ' ' | cut -d' ' -f5 | tr -d '%')
    if [ $disk_usage -gt 80 ]; thenecho "警告:磁盘使用超过80%!"
    fi
    
  • Ping 主机连通性检测

    ping -c1 $IP &>/dev/null
    if [ $? -eq 0 ]; thenecho "$IP 可达"
    elseecho "$IP 不可达"
    fi
    
  • 进程/用户是否存在

    pgrep $process &>/dev/null && echo "存在" || echo "不存在"
    id $user &>/dev/null && echo "用户存在" || echo "用户不存在"
    

3. 嵌套 if 结构

适用于多层判断场景,例如:

if [ 核酸码 ]; thenif [ 体温正常 ]; thenecho "可入教室"fi
fi

三、case 选择结构

用于多分支匹配,比 if...elif 更清晰。

基本语法

case $var inpattern1|pattern2)command1;;pattern3)command2;;*)default_command;;
esac

应用场景

  • 服务启停脚本

    case $1 instart|S) systemctl start vsftpd ;;stop|T)  systemctl stop vsftpd ;;*)       echo "用法: $0 {start|stop}" ;;
    esac
    
  • 交互式菜单

    while true; doread -p "选项[h/f/d/m/u/q]:" optcase $opt inh) help ;;f) fdisk -l ;;d) df -h ;;m) free -m ;;u) uptime ;;q) exit ;;esac
    done
    

四、循环结构

1. while 循环

特点:条件为真时持续执行。

基本语法

while [ condition ]; docommands
done

案例

  • 1~100 累加

    i=1; sum=0
    while [ $i -le 100 ]; dolet sum+=ilet i++
    done
    echo $sum
    
  • 系统监控菜单(死循环 + case)

    while true; doread -p "请选择操作:" actioncase $action ind) df -h ;;m) free -m ;;q) exit ;;esac
    done
    
  • CPU 使用率监控与邮件告警

    cpu_idle=$(top -bn1 | grep "Cpu(s)" | awk '{print $8}' | tr -d '%')
    cpu_usage=$(echo "100 - $cpu_idle" | bc)
    if [ "$(echo "$cpu_usage >= 90" | bc)" -eq 1 ]; thenecho "Subject: CPU告警..." | sendmail -t
    fi
    

2. for 循环

(1)列表遍历

for i in {1..5}; do echo $i; done
for i in a b c; do echo $i; done

(2)参数遍历(无 in)

for arg; do echo $arg; done  # 遍历所有传入参数

(3)类 C 风格

for ((i=1; i<=5; i++)); doecho $i
done

案例:奇数求和

sum=0
for ((i=1; i<=100; i+=2)); dolet sum+=i
done
echo $sum

3. 循环控制关键词

关键字 作用
continue 跳过本次循环,进入下一次
break 终止整个循环
exit 退出整个脚本

示例

for i in {1..5}; do[ $i -eq 3 ] && continue[ $i -eq 4 ] && breakecho $i
done

五、实用脚本案例

1. 批量创建用户并设随机密码

groupadd class &>/dev/null
for i in {1..5}; douseradd -G class u$iecho 123 | passwd --stdin u$i
done

2. 局域网 IP 探活(并行优化)

ip=192.168.88
for ((i=1; i<=10; i++)); do
{ping -c1 $ip.$i &>/dev/null &&echo "$ip.$i is up" >> ip_up.txt ||echo "$ip.$i is down" >> ip_down.txt
} &
done
wait

3. SSH 免密登录批量配置

SERVERS=("192.168.88.101" "192.168.88.102")
[ ! -f ~/.ssh/id_rsa ] && ssh-keygen -t rsa -N ""
for s in "${SERVERS[@]}"; dossh-copy-id -o StrictHostKeyChecking=no root@$s
done

六、随机数生成

基本用法

echo $RANDOM                # 0~32767
echo $[$RANDOM % 10]        # 0~9
echo $[$RANDOM % 101]       # 0~100
echo $[$RANDOM % 51 + 50]   # 50~100

案例:生成 1000 个手机号

for i in {1..1000}; doecho "139$(printf "%08d" $RANDOM$RANDOM | cut -c1-8)" >> phonenum.txt
done

抽奖(隐藏中间号码)

line=$((RANDOM % 1000 + 1))
num=$(sed -n "${line}p" phonenum.txt)
echo "139****${num:7:4}"

七、附录:常用技巧

  • 重定向
    • > file:覆盖输出
    • >> file:追加输出
    • &>/dev/null:丢弃标准输出和错误
  • 字符串截取${var:start:length}
  • 正则判断[[ $str =~ ^[0-9]+$ ]]
  • 小数运算echo "100 - 98.5" | bc

📌 总结:掌握 ifcaseforwhile 四大结构,结合 readtest$?&&/|| 等工具,即可编写高效、健壮的 Shell 自动化脚本。

http://www.jsqmd.com/news/123312/

相关文章:

  • Java Web +疫情物资捐赠和分配系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • 【2025最新】基于SpringBoot+Vue的宠物爱心组织管理系统管理系统源码+MyBatis+MySQL
  • 城市大脑的“预见之眼”:高精度AI气象如何提前3小时预判城市内涝积水点,指挥救援力量精准前置?
  • 2025年浙江口碑好的特氟龙生产厂家排名:特氟龙加工厂推荐有哪些? - mypinpai
  • Open-AutoGLM请假流程实战指南(从零到上线全流程拆解)
  • rohs测试仪靠谱厂家,哪家品牌好? - 品牌推荐大师
  • (Open-AutoGLM认证失败应急方案)生产环境必备的4个容错技巧
  • 【光伏风电功率预测】调度员最需要什么样的 AI 预测?从一条曲线到“可执行方案”
  • 2026消防应急展|国际消防安全展|2026北京消防展览会
  • 提前实测AT4V H00电流传感器,抗谐波干扰性能比同类型产品提升30%!
  • 【企业级报销系统深度解读】:Open-AutoGLM单据提交的7个核心要点
  • 投保流程卡顿频发?Open-AutoGLM智能诊断系统来了,立即解决!
  • Open-AutoGLM中断恢复为何如此高效?解析背后不为人知的3层状态快照架构
  • 【独家深度解读】:Open-AutoGLM大模型轻量化协同的7个核心模块剖析
  • 2025年深圳大牌小样加盟市场分析与品牌推荐,大牌小样加盟公司推荐悦容庄国际专注产品质量 - 品牌推荐师
  • 智和信通监控运维方案赋能某地铁路局运维提效
  • Open-AutoGLM流程跳过实战技巧(90%工程师忽略的关键路径)
  • 2025浙江靠谱特氟龙加工工厂TOP5推荐:看哪家售后好? - myqiye
  • 2025年度扫地机生产厂TOP5权威推荐:清扫设备选型指南 - myqiye
  • PPO算法训练机器人时,如何定义状态/动作/奖励
  • 模型压缩难、部署慢?Open-AutoGLM轻量协同方案,3步搞定千亿参数优化
  • 【内部流出】大厂员工都在用的Open-AutoGLM打卡配置模板(限时分享)
  • 公司监控越来越严,Open-AutoGLM还能安全打卡吗?(最新检测机制分析)
  • 从langchain到langgraph
  • PPO算法训练选择合适的动作空间
  • 稳定性好三维微纳加工品牌推荐:优质设备一览 - 品牌推荐大师1
  • 2025年合肥实木办公桌生产企业排名与专业推荐,看哪家品质好? - mypinpai
  • 33、Windows Server 2016 系统管理与安全防护指南
  • JetBrains2021系列软件安装激活通用教程
  • PPO算法训练机械臂动作进行超参数调优