while

通过判断条件是否成立,对其进行循环,若条件成立,则一直执行循环体中的命令序列,若条件不成立,则退出循环。

在使用while循环的时候,其还与for循环不同,for循环的循环数据是有限的,也就是你所指定的某些数据进行循环。而while是根据你指定的条件对其进行循环,若条件一直成立,则一直循环。这个时候,我们就要避免出现死循环的情况,否则后续命令也无法执行。

语法


while 条件判断
do
命令序列
done


简单案例

例1:简单使用一下循环,a的值小于5,则循环加一,直到大于或等于5

#!/bin/bash
#date:2020-3-2
#描述:for简单案例
a=1
while [ $a -lt 5 ]
do
a=$[$a+1]
echo "a的值为$a"
done

执行效果:

[root@linus ~]# sh while_test.sh 
a的值为2
a的值为3
a的值为4
a的值为5

例2:设置一个从1加到n的小案例

#!/bin/bash
#date:2020-3-2
#描述:for简单案例
read -p "请输入从1加到哪里:" num
a=1
b=0
while [ $a -le $num ]
do
b=$[$b+$a]
let a++
done
echo    "结果为$b"

执行效果:

[root@linus ~]# sh while_test.sh 
请输入从1加到哪里:2
结果为3

例3:批量自主添加用户脚本,并提示是否设置过期时间

#!/bin/bash
#date:2020-3-2
#描述:批量添加用户脚本
read -p "你想创建几个用户:" num
a=0
while [ $a -lt $num ]
do 
read -p "请输入需要创建的用户:" name
read -p "请输入用户密码:" passwd
read -p "是否设置过期时间(yes|no):" date
case $date in
yes|YES|Y|y)
	read -p "请输入过期时间:" date2
	useradd -e $date2 $name
	;;
NO|no|N|n)
	echo "无过期时间,直接创建"
	useradd $name
	;;
*)
	echo "输入为其他字符,使用默认选项,无过期时间"
	useradd $name
esac
echo "$passwd" | passwd --stdin $name &>/dev/null
echo "$name用户创建成功"
let a++
done

执行效果:

[root@linus ~]# sh while_user.sh 
你想创建几个用户:1 
请输入需要创建的用户:caiwu
请输入用户密码:caiwu.com
是否设置过期时间(yes|no):yes
请输入过期时间:2020-3-9
caiwu用户创建成功

例4:批量自主删除用户脚本,并提示是否继续删除

#!/bin/bash
#date:2020-3-2
#描述:批量删除用户脚本
daan ()
{
read -p "是否要删除用户(yes|no):" daan
}
daan
while [ $daan = yes ]
do
read -p "请输入要删除的用户:" user
userdel -r $user 
echo	"$user用户已删除"
daan
done

执行效果:

[root@linus ~]# sh while_del.sh 
是否要删除用户(yes|no):yes
请输入要删除的用户:user
user用户已删除
是否要删除用户(yes|no):no

例5:猜测商品价格小游戏

#!/bin/bash
#date:2020-3-2
#描述:猜测商品价格游戏
a=`expr $RANDOM % 100`
while true
do
read -p "输入商品价格(0-100):" int
if [ $int -eq $a ]
then
        echo "恭喜你,猜对了"
        exit 0
elif [ $int -gt $a ]
then
        echo "猜测价格高于实际价格"
else
        echo "猜测价格低于实际价格"
fi
done

执行效果:

[root@linus ~]# sh for_game.sh 
输入商品价格(0-100):40
猜测价格高于实际价格
输入商品价格(0-100):30
猜测价格低于实际价格
输入商品价格(0-100):37
猜测价格高于实际价格
输入商品价格(0-100):35
猜测价格高于实际价格
输入商品价格(0-100):33
猜测价格高于实际价格
输入商品价格(0-100):31
猜测价格低于实际价格
输入商品价格(0-100):32
恭喜你,猜对了