文章目录
文章内容主要包括: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 语句
shell
if [ 条件测试操作 ]
then
命令序列
fi
双分支 if 语句
shell
if [ 条件测试操作 ]
then
命令序列 1
else
命令序列 2
fi
2. if -then-elif-else-fi多分支
else if -->elif
shell
if 条件测试
then
执行命令
elif 条件测试
then
执行命令
elif 条件测试
then
执行命令
else
fi
3. if嵌套
shell
if 条件测试
then
执行命令
if 条件测试
then
执行命令
else
fi
else
fi
for循环语句
在for循环结构中:
- 基本语法格式:
bash
for 变量名 in 列表值
do
# 循环体语句
done
- 变量名不需要加$符号声明
- do关键字标记循环体的开始
- done关键字标记循环体的结束
- 执行特点:
- 循环会遍历列表中的所有元素
- 每次迭代将当前列表元素赋值给循环变量
- 必须处理完列表中所有元素才会退出循环
- 不能中途使用break跳出(除非特别声明)
- 示例应用场景:
bash
# 遍历当前目录下的.txt文件
for file in *.txt
do
echo "正在处理文件: $file"
wc -l $file
done
# 遍历数字序列
for i in {1..5}
do
echo "第$i次循环"
done
# 遍历命令输出结果
for user in $(cat /etc/passwd | cut -d: -f1)
do
echo "系统用户: $user"
done
- 注意事项:
- 列表可以是:显式列表、命令输出、文件名通配、数字序列等
- 循环变量只在循环体内有效
- 缩进不是必须的,但能提高可读性
- 在循环体内引用变量时需要加$符号
简单for循环
shell
for [变量名1] in [取值列表]
do
执行语句
done
嵌套for循环基本语法结构
shell
# 外层循环代码
for 外层变量 in 序列; do
# 内层循环代码
for 内层变量 in 序列; do
done
done
- 两次for嵌套
shell
for [变量名1] in [取值列表]
do
for [变量名2] in [取值列表]
do
执行语句
done
done
示例:99乘法表
shell
#!/bin/bash
# 生成九九乘法表
echo "=== 九九乘法表 ==="
for i in {1..9}; do
for j in {1..9}; do
if [ $j -le $i ]; then
result=$((i * j))
printf "%d×%d=%-2d " $j $i $result
fi
done
echo
done
- 类似C语言的
shell
for (( 表达式1;表达式2;表达式3 ))
do
执行语句
done
嵌套
shell
for (( 表达式1;表达式2;表达式3 ))
do
执行语句
for (( 表达式4;表达式5;表达式6 ))
do
执行语句
done
done
shell
#!/bin/bash
#制作一个99乘法表
echo "--------------九九乘法表--------------"
for ((i=1;i<=9;i++))
do
for ((j=1;j<=i;j++))
do
num=$((j*i))
echo -n "${j}*${i}=${num} "
done
echo
done
- for语句里嵌套if语句
bash
for 变量 in 可迭代对象:
if 条件表达式:
# 条件成立时执行的代码块
示例:
shell
#!/bin/bash
#求0到50的奇偶和
#偶数和
sum3=0
#奇数和
sum4=0
for ((i=0;i<=50;i++))
do
a=$(($i%2))
if [ $a -eq 0 ]
then
sum3=$(( $i + $sum3 ))
else
sum4=$(( $i + $sum4 ))
fi
done
echo "0到50偶数和:$sum3"
echo "0到50奇数和:$sum4"
简单总结:
for 变量名 in 表达式 (①作为变量名的变量值遍历赋值②控制for循环的次数)
do
执行指令
done
while循环语句
while循环是一种在满足特定条件时重复执行代码块的循环结构。
当while后的条件成立时,执行循环体内的代码
python
while condition:
# 循环体代码
执行逻辑解析
条件检查:程序首先评估condition(布尔表达式)。若结果为True,进入循环体;若为False,跳过循环。
循环体执行:执行循环体内的代码,完成后再次检查条件。
重复过程:上述步骤重复,直到条件变为False时终止循环。
需要注意条件逻辑,避免进入死循环。
while循环语句的格式:
#不带条件的
bash
while true
do
#循环代码体
执行任务
done
#带条件的
bash
while [条件判断(--ture)]
do
#循环代码体
执行任务
done
或
while [条件判断(--ture)];do
#循环代码体
执行任务
done
while循环结束标志 while true
示例:
shell
#!/bin/bash
# 用户输入验证循环
while true; do
read -p "请输入用户名 (至少3个字符): " username
# 检查用户名长度
if [ ${#username} -lt 3 ]; then
echo "错误:用户名太短!"
continue
fi
# 检查是否只包含字母数字
if [[ ! "$username" =~ ^[a-zA-Z0-9]+$ ]]; then
echo "错误:用户名只能包含字母和数字!"
continue
fi
echo "✅ 用户名有效: $username"
break
done
# 基础数字循环
#当count小于等于5的时候,执行计数
count=1
while [ $count -le 5 ]
do
echo "当前计数: $count"
count=$((count + 1))
done
实验:
猜价格游戏
使用循环语句写shell
需求:
1、使用RANDOM 随机一个1~100的数字
2、和用户进行交互,当前已随机出一个1~100的数字,猜猜看是几?
3、如果用户猜大了,提示,你猜的数字大了
如果用户猜小了,提示,你猜的数字小了
如果用户猜对了,提示,恭喜猜对了,随机数是x,你一共猜了x次!
其他:输入有误
shell
#!/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}次" && break
done
echo "游戏结束"
猜随机数
shell
#!/bin/bash
#case完成
#计次数
count=0
#随机数
a=$(($RANDOM % 100 + 1))
while true
do
let count++
read -p "请输入你猜的数字(0~100):" b
[ ${a} -lt ${b} ] && ch="more"
[ ${a} -gt ${b} ] && ch="less"
[ ${a} -eq ${b} ] && ch="eq"
case ${ch} in
more)
echo "提示,你猜的数大了"
;;
less)
echo "提示,你猜的数小了"
;;
eq)
echo "提示,恭喜猜对了,随机数是${a},你一共猜了${count}次"
exit 0
;;
*)
echo "输入有误,请重新输入"
let count--
;;
esac
done
另一种表达大小的方法
shell
#!/bin/bash
#猜数字
n1=$(($RANDOM % 100 + 1))
i=0
while true
do
let i++
read -p "请输入你猜测随机生成数为多少(0-100):" n2
#"-*"表示负数,"*"表示正数
n3=$[n2-n1]
case ${n3} in
0)
echo "提示,恭喜猜对了,随机数是${n1},你一共猜了${i}次"
exit 0
;;
-*)
echo "提示,你猜的数小了"
;;
*)
echo "提示,你猜的数大了"
;;
esac
done
批量管理用户
shell
#!/bin/bash
i=0
while [ "${i}" -le 20 ]
do
useradd stu${i}
echo "123456" | passwd --stdin stu${i} &>/dev/full
if [ $? -eq 0 ]
then
echo "用户 stu${i} 被建立"
else
echo "用户 stu${i} 建立失败"
fi
let i++
done
i=0
while [ "${i}" -le 20 ]
do
userdel -r stu${i}
let i++
done
while循环的关键要点:
- 条件检查:在每次迭代前检查条件
- 灵活的条件:可以是测试命令、其他命令的退出状态
- 循环控制:使用 break 和 continue 控制流程
- 无限循环:while true 或 while :
- 读取输入:与 read 命令配合处理用户输入
适用场景:
● 用户输入验证
● 服务状态监控
● 文件内容处理
● 资源监控
● 定时任务执行
● 不确定次数的循环任务
最佳实践: - 总是设置退出条件,避免无限循环
- 在循环内处理错误情况
- 对于长时间运行的循环,添加适当的延迟
- 使用局部变量避免污染全局命名空间
- 在条件中使用简单的测试,避免昂贵操作
while死循环
死循环语句
shell
while [1 -eq 1] 判断条件写一个永久为真的条件
do 一直执行do内的命令
done
小知识:
- 两种写法
while true 直接写判断条件为真
do 一直执行do内的命令
done
while : 判断条件为冒号也表示死循环
do 一直执行do内的命令
done
- 与for循环的区别
while循环适用于不确定迭代次数的场景(如用户输入验证),而for循环更适合遍历已知序列(如列表、字符串)。
未完待更...