while 条件循环语句是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数,完全不同于 for 循环语句中有目标、有范围的使用场景。 while 循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环。
这里我们构建一个猜数字游戏的实例来了解while
命令以及相关循环的用法。
猜数字游戏想必大家不陌生,由一个人作为裁判,选择一个数字,先指定大致范围,由众人猜测,根据猜测给出“高”或者“低”的评价,然后缩小范围,最后猜中的人有特别的“奖励”。
这里先指定大致的范围为0-999
,脚本如下:
#!/usr/bin/env bash
# While usage: guess number
NUMBER=$(expr $RANDOM % 1000 )
TIMES=0
echo "The number is between 0-999, please guess it."
while true
do
read -p "Please input the number: " INT
let TIMES++
if [ $INT -eq $NUMBER ]; then
echo "You are right! The number is $NUMBER."
echo "You guess $TIMES times."
exit 0
elif [ $INT -gt $NUMBER ]; then
echo "Too high... Please guess it again."
else
echo "Too low... Please guess it again."
fi
done
该脚本使用$RANDOM 变量来调取出一个随机的数值(范围为 0~32767),将这个随机数对 1000 进行取余操作,并使用 expr 命令取得其结果,再用这个数值与用户通过 read命令输入的数值进行比较判断。这个判断语句分为三种情况,分别是判断用户输入的数值是等于、大于还是小于使用 expr 命令取得的数值。当前,现在这些内容不是重点,我们当前要关注的是while 条件循环语句中的条件测试始终为 true,因此判断语句会无限执行下去,直到用户输入的数值等于 expr 命令取得的数值后,这两者相等之后才运行 exit 0 命令,终止脚本的执行。
在这个脚本中,我们添加了一些交互式的信息,从而使得用户与系统的互动性得以增强。而且每当循环到 let TIMES++命令时都会让 TIMES 变量内的数值加 1,用来统计循环总计执行了多少次。
下面看下我的实际猜测过程:
[zhoudan@linuxprobe Desktop]$ ./guessNumber.sh
The number is between 0-999, please guess it.
Please input the number: 500
Too low... Please guess it again.
Please input the number: 700
Too high... Please guess it again.
Please input the number: 600
Too high... Please guess it again.
Please input the number: 550
Too low... Please guess it again.
Please input the number: 570
Too low... Please guess it again.
Please input the number: 580
Too low... Please guess it again.
Please input the number: 590
Too low... Please guess it again.
Please input the number: 595
Too low... Please guess it again.
Please input the number: 596
Too low... Please guess it again.
Please input the number: 597
Too low... Please guess it again.
Please input the number: 598
Too low... Please guess it again.
Please input the number: 599
You are right! The number is 599.
You guess 12 times.
有兴趣的话,可以自己写写,甚至完善,玩一玩。
引用部分摘自《Linux就该这么学》,脚本代码为适应本文修改。