文章目录
while循环与until循环
while循环
while循环的基本格式
while [ 判断条件 ]
do
执行动作
done
- 判断条件:这是一个返回真(0)或假(非0)的表达式。如果条件为真,则执行
do
和done
之间的命令;如果条件为假,则跳过这些命令,继续执行done
之后的命令。 - 执行动作:这是当判断条件为真时要执行的命令或命令序列。
- done:这标志着
while
循环的结束。
示例:打印0到5的数字
#!/bin/bash
i=0
while [ $i -le 5 ]
do
echo "$i"
let i++
done
死循环的几种实现方式
死循环是指循环条件永远为真,导致循环体内的命令无限次执行。
- 使用固定为真的条件
while [ 1 -eq 1 ] do # 执行命令 done
- 使用
true
命令
true
是一个总是返回真(0)的命令,因此可以直接用作while
循环的条件。while true do # 执行命令 done
- 使用冒号(
:
)
冒号(:
)是一个空命令,它等价于true
,也常用于创建死循环。while : do # 执行命令 done
注意
- 在使用
while
循环时,确保循环条件最终会变为假,以避免无限循环。 - 如果需要在循环内部改变循环条件,确保这些改变是有效的,并且确实能够影响循环的继续执行。
- 在编写死循环时,通常需要在循环体内添加某种形式的退出条件(如使用
break
语句),以便在需要时能够退出循环。
退出循环
- break:用于立即退出循环。
- continue:用于跳过当前循环的剩余部分,直接开始下一次循环的迭代(如果条件仍然为真)。
- 修改循环条件:通过修改循环条件使其变为假,从而自然退出循环。
until循环、与while循环的区别
until
循环确实是一种在条件不满足时持续执行循环体,直到条件满足时退出循环的控制结构。它与 while
循环相反,while
循环是在条件满足时执行循环体。
until 循环示例
首先,我们来看 until
循环的示例:
#!/bin/bash
i=0
sum=0
until [ $i -gt 10 ] # 当 $i 大于 10 时退出循环
do
echo $i # 打印当前的 $i 值
let i++ # $i 自增
sum=$(($sum+$i)) # 将 $i 的值加到 $sum 上
done
echo "Sum: $sum" # 循环结束后打印总和
在这个脚本中,until
循环会一直执行,直到 $i
的值大于 10。每次循环都会打印当前的 $i
值,将其加到 $sum
上,并将 $i
自增。循环结束后,会打印出 $sum
的值。
while 循环方式
接下来,我们看一个 while
循环的示例,该示例计算从 0 到 100(包括 100)的整数和:
#!/bin/bash
i=0
sum=0
while [ $i -le 100 ] # 当 $i 小于或等于 100 时执行循环
do
sum=$((sum+i)) # 将 $i 的值加到 $sum 上,注意这里使用了更现代的算术扩展语法
let i++ # $i 自增
done
echo "Sum: $sum" # 循环结束后打印总和
在这个脚本中,while
循环会一直执行,直到 $i
的值大于 100。每次循环都会将 $i
的值加到 $sum
上,并将 $i
自增。循环结束后,会打印出 $sum
的值。
注意
- 在 Bash 脚本中,算术扩展通常使用
$((expression))
语法,它比旧的$[expression]
语法更现代、更灵活。 - 在
until
和while
循环中,确保循环条件最终会改变,以避免无限循环。 - 在
let
命令中,变量名前不需要加$
符号,但在算术扩展或赋值操作中通常需要。 - 脚本开头应使用
#!/bin/bash
来指定解释器,以确保脚本在 Bash 环境中执行。
有趣的实例
批量建立用户
#!/bin/bash
i=0
while [ "$i" -le 20 ]
do
useradd stu$i 2>/dev/null
if [ $? -eq 0 ]; then
echo "123456" | passwd --stdin stu$i &>/dev/null
if [ $? -eq 0 ]; then
echo "用户 stu$i 被建立并设置密码"
else
echo "用户 stu$i 密码设置失败"
fi
else
echo "用户 stu$i 建立失败"
fi
let i++
done
批量删除用户
#!/bin/bash
i=0
while [ "$i" -le 20 ]
do
if userdel -r stu$i; then
echo "用户 stu$i 已被删除"
else
echo "删除用户 stu$i 失败"
fi
let i++
done
猜价格游戏
#!/bin/bash
p=$((RANDOM % 1000 + 1))
t=1
while true
do
read -p "请输入商品的价格1-1000: " num
let t++
if [ "$num" -eq "$p" ]; then
echo "恭喜你猜中了,实际价格是$p"
echo "您一共猜了$t次"
break
elif [ "$num" -gt "$p" ]; then
echo "您猜的价格高了"
else
echo "您猜的价格低了"
fi
done
密码输入验证
#!/bin/bash
i=1
psd="123456"
while [ "$i" -le 3 ]; do
read -p "请输入验证密码:" key
if [ "$key" = "$psd" ]; then
echo "密码输入正确!"
exit 0
else
echo "输入错误!"
let i++
fi
done
echo "密码输入错误次数超过三次!已经锁定!"
exit 1
说明
- 错误处理:在
useradd
和userdel
命令后添加了错误检查,以便在出现错误时给出适当的反馈。 - 密码设置:在批量建立用户的脚本中,如果
useradd
成功,则尝试设置密码,并检查passwd
命令的返回值。 - 逻辑优化:在密码输入验证脚本中,如果密码正确,则直接退出脚本;如果连续三次错误,则输出锁定信息并退出脚本。
- 变量引用:在比较和赋值时,使用双引号将变量括起来,以避免由于变量未定义或为空而导致的潜在问题。