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

shell(4)--shell脚本中的循环:(if循环,for,while,until)和退出循环(continue,break, exit)

文章目录

    • if语句
      • 单分支 if 语句
      • 双分支 if 语句
      • 2. if -then-elif-else-fi多分支
      • 3. if嵌套
    • for循环语句
      • 简单for循环
      • 嵌套for循环基本语法结构
    • while循环语句
      • while循环语句的格式:
      • 实验:
        • 猜价格游戏
        • 猜随机数
        • 批量管理用户
      • while循环的关键要点:

文章内容主要包括:if简单循环和嵌套循环,for简单循环和嵌套循环,while简单循环和嵌套循环,until循环以及部分示例;退出循环的语句:continue跳过本次循环,break退出循环,exit退出循环带状态码及其部分的示例。

if语句

if语句是一种条件控制结构,用于根据特定条件的真假决定是否执行某段代码。条件通常是一个布尔表达式,结果为true或false。

判断条件执行流程:
当程序执行到if语句时,会先计算括号内的条件表达式。

如果条件为true,则执行if后的代码块(花括号{}内的内容)。
如果条件为false,则跳过该代码块,继续执行后续语句。
扩展结构:else和else if

  • else:当if条件为false时,执行else后的代码块。
  • else if:用于链式判断多个条件,按顺序检查直到某个条件为true。

单分支 if 语句

if [ 条件测试操作 ]
then
命令序列
fi

双分支 if 语句

if  [  条件测试操作  ]then命令序列 1else命令序列 2
fi

2. if -then-elif-else-fi多分支

else if -->elif

if 条件测试then执行命令elif 条件测试then执行命令elif 条件测试then执行命令
elsefi

3. if嵌套

if 条件测试then执行命令if 条件测试then执行命令elsefi
elsefi

for循环语句

在for循环结构中:

  1. 基本语法格式:
for 变量名 in 列表值
do# 循环体语句
done
  • 变量名不需要加$符号声明
  • do关键字标记循环体的开始
  • done关键字标记循环体的结束
  1. 执行特点:
  • 循环会遍历列表中的所有元素
  • 每次迭代将当前列表元素赋值给循环变量
  • 必须处理完列表中所有元素才会退出循环
  • 不能中途使用break跳出(除非特别声明)
  1. 示例应用场景:
# 遍历当前目录下的.txt文件
for file in *.txt
doecho "正在处理文件: $file"wc -l $file
done# 遍历数字序列
for i in {1..5}
doecho "第$i次循环"
done# 遍历命令输出结果
for user in $(cat /etc/passwd | cut -d: -f1)
doecho "系统用户: $user"
done
  1. 注意事项:
  • 列表可以是:显式列表、命令输出、文件名通配、数字序列等
  • 循环变量只在循环体内有效
  • 缩进不是必须的,但能提高可读性
  • 在循环体内引用变量时需要加$符号

简单for循环

for [变量名1] in  [取值列表]
do执行语句
done

嵌套for循环基本语法结构

# 外层循环代码for 外层变量 in 序列; do# 内层循环代码for 内层变量 in 序列; dodone
done
  1. 两次for嵌套
 for [变量名1] in  [取值列表]
dofor [变量名2] in  [取值列表]do执行语句done
done

示例:99乘法表

#!/bin/bash
# 生成九九乘法表echo "=== 九九乘法表 ==="for i in {1..9}; dofor j in {1..9}; doif [ $j -le $i ]; thenresult=$((i * j))printf "%d×%d=%-2d " $j $i $resultfidoneecho
done
  1. 类似C语言的
for (( 表达式1;表达式2;表达式3 ))
do执行语句
done

嵌套

for (( 表达式1;表达式2;表达式3 ))
do执行语句for (( 表达式4;表达式5;表达式6 ))do执行语句done
done
#!/bin/bash
#制作一个99乘法表echo "--------------九九乘法表--------------"
for ((i=1;i<=9;i++))
dofor ((j=1;j<=i;j++))donum=$((j*i))echo -n "${j}*${i}=${num} "doneecho
done
  1. for语句里嵌套if语句
for 变量 in 可迭代对象:if 条件表达式:# 条件成立时执行的代码块

示例:

#!/bin/bash
#求0到50的奇偶和
#偶数和
sum3=0
#奇数和
sum4=0for ((i=0;i<=50;i++))
doa=$(($i%2))if [ $a -eq 0 ]thensum3=$(( $i + $sum3 ))elsesum4=$(( $i + $sum4 ))fi
done
echo "0到50偶数和:$sum3"
echo "0到50奇数和:$sum4"

简单总结:
for 变量名 in 表达式 (①作为变量名的变量值遍历赋值②控制for循环的次数)
do
执行指令
done

while循环语句

while循环是一种在满足特定条件时重复执行代码块的循环结构。
当while后的条件成立时,执行循环体内的代码

while condition:# 循环体代码

执行逻辑解析
条件检查:程序首先评估condition(布尔表达式)。若结果为True,进入循环体;若为False,跳过循环。
循环体执行:执行循环体内的代码,完成后再次检查条件。
重复过程:上述步骤重复,直到条件变为False时终止循环。
需要注意条件逻辑,避免进入死循环。

while循环语句的格式:

#不带条件的

while true
do#循环代码体执行任务
done

#带条件的

while [条件判断(--ture)]
do#循环代码体执行任务
donewhile [条件判断(--ture)];do#循环代码体执行任务
done
while循环结束标志 while true

示例:

#!/bin/bash
# 用户输入验证循环while true; doread -p "请输入用户名 (至少3个字符): " username# 检查用户名长度if [ ${#username} -lt 3 ]; thenecho "错误:用户名太短!"continuefi# 检查是否只包含字母数字if [[ ! "$username" =~ ^[a-zA-Z0-9]+$ ]]; thenecho "错误:用户名只能包含字母和数字!"continuefiecho "✅ 用户名有效: $username"break
done# 基础数字循环
#当count小于等于5的时候,执行计数
count=1
while [ $count -le 5 ]
doecho "当前计数: $count"count=$((count + 1))
done

实验:

猜价格游戏

使用循环语句写shell
需求:
1、使用RANDOM 随机一个1~100的数字
2、和用户进行交互,当前已随机出一个1~100的数字,猜猜看是几?
3、如果用户猜大了,提示,你猜的数字大了
如果用户猜小了,提示,你猜的数字小了
如果用户猜对了,提示,恭喜猜对了,随机数是x,你一共猜了x次!
其他:输入有误

#!/bin/bash
#变量i统计猜的次数
i=0
#生成一个随机数num1
num1=$(($RANDOM % 100 + 1))while true
do#let i++,每猜测一次,计一次let i++read -p "请输入你猜的数字(0~100):" num2#[[ ! ${num2} =~ ^[0-9]+$ ]] || [ ${num2} -lt 0 ] || [ ${num2} -gt 100 ] && echo "提示,你的输入有误" && let i-- && continue[ ${num1} -lt ${num2} ] && echo "提示,你猜的数大了"[ ${num1} -gt ${num2} ] && echo "提示,你猜的数小了"[ ${num1} -eq ${num2} ] && echo "提示,恭喜猜对了,随机数是${num1},你一共猜了${i}次" && breakdone
echo "游戏结束"
猜随机数
#!/bin/bash
#case完成
#计次数
count=0
#随机数
a=$(($RANDOM % 100 + 1))while truedolet count++read -p "请输入你猜的数字(0~100):" b[ ${a} -lt ${b} ] && ch="more"[ ${a} -gt ${b} ] && ch="less"[ ${a} -eq ${b} ] && ch="eq"case ${ch} inmore)echo "提示,你猜的数大了";;less)echo "提示,你猜的数小了";;eq)echo "提示,恭喜猜对了,随机数是${a},你一共猜了${count}次"exit 0;;*)echo "输入有误,请重新输入"let count--;;esac
done

另一种表达大小的方法

#!/bin/bash
#猜数字
n1=$(($RANDOM % 100 + 1))
i=0
while true
dolet i++read -p "请输入你猜测随机生成数为多少(0-100):" n2#“-*”表示负数,“*”表示正数n3=$[n2-n1]case ${n3} in0)echo "提示,恭喜猜对了,随机数是${n1},你一共猜了${i}次"exit 0;;-*)echo "提示,你猜的数小了";;*)echo "提示,你猜的数大了";;esac
done
批量管理用户
#!/bin/bash
i=0
while [ "${i}" -le 20 ]
douseradd stu${i}echo "123456" | passwd --stdin stu${i} &>/dev/fullif [ $? -eq 0 ]thenecho "用户 stu${i} 被建立"elseecho "用户 stu${i} 建立失败"filet i++
donei=0
while [ "${i}" -le 20 ]
do
userdel -r stu${i}
let i++
done

while循环的关键要点:

  1. 条件检查:在每次迭代前检查条件
  2. 灵活的条件:可以是测试命令、其他命令的退出状态
  3. 循环控制:使用 break 和 continue 控制流程
  4. 无限循环:while true 或 while :
  5. 读取输入:与 read 命令配合处理用户输入
    适用场景:
    ● 用户输入验证
    ● 服务状态监控
    ● 文件内容处理
    ● 资源监控
    ● 定时任务执行
    ● 不确定次数的循环任务
    最佳实践:
  6. 总是设置退出条件,避免无限循环
  7. 在循环内处理错误情况
  8. 对于长时间运行的循环,添加适当的延迟
  9. 使用局部变量避免污染全局命名空间
  10. 在条件中使用简单的测试,避免昂贵操作
    while死循环
    死循环语句
while  [1  -eq  1]   判断条件写一个永久为真的条件 do       一直执行do内的命令
done

小知识:

  1. 两种写法
    while true 直接写判断条件为真
    do 一直执行do内的命令
    done

while : 判断条件为冒号也表示死循环
do 一直执行do内的命令
done
2. 与for循环的区别
while循环适用于不确定迭代次数的场景(如用户输入验证),而for循环更适合遍历已知序列(如列表、字符串)。

未完待更…

http://www.dtcms.com/a/585176.html

相关文章:

  • IDEA 软件下载 + 安装 | 操作步骤
  • seo建站推广泉州建站软件
  • HarmonyOS 诗词填空游戏开发实战教程(非AI生成 提供源代码和演示视频)
  • 【期末网页设计作业】HTML+CSS+JavaScript 蜡笔小新 动漫主题网站设计与实现(附源码)
  • 柳州建站衣联网和一起做网站。哪家强
  • 深入解析CFS虚拟运行时间:Linux公平调度的核心引擎
  • cdr做网站流程哪家公司做网站结算好
  • 专业课复习计划
  • SQL50+Hot100系列(11.8)
  • 猫狗识别数据集:34,441张高质量标注图像,深度学习二分类任务训练数据集,计算机视觉算法研发,CNN模型训练,图像识别分类,机器学习实践项目完整数据资
  • DOM NodeList 简介
  • 【数据结构】unordered 系列容器底层结构和封装
  • 昆明做网站要多少钱京津冀协同发展交通一体化规划
  • Rust编程学习 - 问号运算符会return一个Result 类型,但是如何使用main函数中使用问号运算符
  • 『 数据库 』MySQL索引深度解析:从数据结构到B+树的完整指南
  • Spring JDBC源码解析:模板方法模式的优雅实践
  • 19-Node.js 操作 Redis 实战指南:ioredis 客户端全解析与异步场景落地
  • linux服务-iptables 原理及示例详解
  • Firebase 架构原理与实战入门:从零搭建你的第一个云端应用
  • 精品在线试题库系统|基于SpringBoot和Vue的精品在线试题库系统(源码+数据库+文档)
  • AI时代职场反脆弱性:杠铃策略平衡稳定工作与高风险创新
  • 网站搭建的步骤wordpress 添加评论
  • SLAM中的非线性优-3D图优化之轴角在Opencv-PNP中的应用(一)
  • Rust 练习册 :Poker与扑克牌游戏
  • 【python】基础案例分析
  • LeetCode(python)——15.三数之和
  • Java基础——集合进阶用到的数据结构知识点1
  • 无线交换机(AC)核心技术详解:构建集中式Wi-Fi网络的基石
  • DNS的正向、反向解析的服务配置知识点及实验
  • 庖丁解牛:深度剖析 Ascend C 算子开发流程与核心概念