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循环结构中:
- 基本语法格式:
for 变量名 in 列表值
do# 循环体语句
done
- 变量名不需要加$符号声明
- do关键字标记循环体的开始
- done关键字标记循环体的结束
- 执行特点:
- 循环会遍历列表中的所有元素
- 每次迭代将当前列表元素赋值给循环变量
- 必须处理完列表中所有元素才会退出循环
- 不能中途使用break跳出(除非特别声明)
- 示例应用场景:
# 遍历当前目录下的.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
- 注意事项:
- 列表可以是:显式列表、命令输出、文件名通配、数字序列等
- 循环变量只在循环体内有效
- 缩进不是必须的,但能提高可读性
- 在循环体内引用变量时需要加$符号
简单for循环
for [变量名1] in [取值列表]
do执行语句
done
嵌套for循环基本语法结构
# 外层循环代码for 外层变量 in 序列; do# 内层循环代码for 内层变量 in 序列; dodone
done
- 两次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
- 类似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
- 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#循环代码体执行任务
done
或
while [条件判断(--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循环的关键要点:
- 条件检查:在每次迭代前检查条件
- 灵活的条件:可以是测试命令、其他命令的退出状态
- 循环控制:使用 break 和 continue 控制流程
- 无限循环:while true 或 while :
- 读取输入:与 read 命令配合处理用户输入
适用场景:
● 用户输入验证
● 服务状态监控
● 文件内容处理
● 资源监控
● 定时任务执行
● 不确定次数的循环任务
最佳实践: - 总是设置退出条件,避免无限循环
- 在循环内处理错误情况
- 对于长时间运行的循环,添加适当的延迟
- 使用局部变量避免污染全局命名空间
- 在条件中使用简单的测试,避免昂贵操作
while死循环
死循环语句
while [1 -eq 1] 判断条件写一个永久为真的条件 do 一直执行do内的命令
done
小知识:
- 两种写法
while true 直接写判断条件为真
do 一直执行do内的命令
done
while : 判断条件为冒号也表示死循环
do 一直执行do内的命令
done
2. 与for循环的区别
while循环适用于不确定迭代次数的场景(如用户输入验证),而for循环更适合遍历已知序列(如列表、字符串)。
未完待更…
