while 结构:
while循环语句也称前测试循环语句,它的循环重复执行次数,是利用一个条件来控制是否继续重复执行这个语句。while语句与for循环语句相比,无论是语法还是执行的流程,都比较简明易懂。while循环格式如下:
while expression
do
command
command
…
done
while循环语句之所以命名为前测试循环,是因为它要先判断此循环的条件是否成立,然后才作重复执行的操作。也就是说,while循环语句执行过程是:先判断expression的退出状态,如果退出状态为0,则执行循环体,并且在执行完循环体后,进行下一次循环,否则退出循环执行done后的命令。
为了避免死循环,必须保证在循环体中包含循环出口条件,即存在expression的退出状态为非0的情况。
1 计数器形式的 while
假定该种情形是在已经准确知道要输入的数据或字符串的数目,在这种情况下可采用计数器控制的while循环结构来处理。这种情形下while循环的格式如下所示:
counter = 1
while expression
do
command
…
let commandto operate counter
command
…
done
#!/bin/bash
i=0
sum=0
while (( i < 10 ))
do
echo "i: $i, sum: $sum"
let "sum+=$i"
let "i++"
done
在Linux Shell编程中很多时候不知道读入数据的个数,但是可以设置一个特殊的数据值来结束while循环,该特殊数据值称为结束标记,其通过提示用户输入特殊字符或数字来操作。当用户输入该标记后结束while循环,执行done后的命令。在该情形下,while循环的形式如下所示:
read variable
while [["$variable" != sentinel ]]
do
readvariable
done
#!/bin/bash
echo "enter a number:"
read var
while [ $var != "bye" ]
do
echo "your input is : $var"
read var
done
有时需要使用命令行来指定输出参数和参数个数,这时用其他的三种形式的while循环是无法实现的,所以需要使用命令行控制的while循环。该形式下,while循环通常与shift结合起来使用,其中shift命令使位置变量下移一位(即$2代替$1,$3代替$2),并且使$#变量递减,当最后一个参数也显示给用户后,$#就会等于0,同时$*也等于空,下面是该情形下,while循环的形式为:
while [["$*" != "" ]]
do
echo"$1"
shift
done
eg#!/bin/bash
while [ "$*" != "" ]
do
echo "$1"
shift
done
运行结果
anders@anders-virtual-machine:~/code/shell/while$ ./while3.sh 1 2 3
1
2
3