在之前的博文中我们讨论了 Shell语言学习笔记(三)—— for循环 语句的使用,下面我们介绍另一种也可以用于实现多次的重复操作的循环语句——while循环语句。
在shell中,while循环语句的一般语法如下:
while [ condition ]
do
commands
done
其中 condition是判断条件,若condition为真,则执行循环体内的命令;若condition为假,则直接退出当前循环。commands表示需要执行的命令,可以有多个。当所有命令执行完后,再次检查condition是否为真,如果为真,则继续执行循环体内的命令;如果为假,则退出循环。此外,判断条件可以是一个条件,也可以是多个条件通过操作符&&、||、!连接的综合条件。注意:在使用逻辑操作符时,需要将条件用括号括起来,以明确优先级。
实例1:计算1到10的和
~/shell$ cat while.sh
#!/bin/bash
sum=0 #对sum进行赋初值
i=0
while [ $i -le 10 ]
do
sum=$(($sum+$i)) #求和
i=$((i+1)) #循环变量 i 加一
done
echo $((sum))
j=0
sum1=0
while [ $j -le 10 ]
do
sum1=$(($sum1+$j)) #求和
let j++ #循环变量 i 加一
done
echo $((sum1))
~/shell$ bash while.sh
55
55
注意:while中的循环变量不会自动变化,需要使用语句实现循环变量的变化。
实例2:输出1~10
~/shell$ cat while.sh
#!/bin/bash
echo "以下输出1~10:"
i=1
while [ $i -le 10 ]
do
echo $i
i=$((i+1)) #循环变量 i 加一
done
#输出1~10以内的偶数
echo "以下输出1~10以内的偶数:"
j=1
while [ $j -le 10 ]
do
if [ $(($j%2)) -eq 0 ];then # %符号为取余
echo $j
fi
j=$((j+1)) #循环变量 i 加一
done
~/shell$ bash while.sh
以下输出1~10:
1
2
3
4
5
6
7
8
9
10
以下输出1~10以内的偶数:
2
4
6
8
10
实例3:特殊图形的输出,此处以菱形为例
~/shell$ cat while.sh
#!/bin/bash
read -p "请输入菱形的对角线长度的一半:" l
#菱形的对角线上的*的个数为:2l+1
#当变量参数小于l时,该行既有空格又有*号。*号的个数为2i+1,其余为空格
#当变量参数等于l时,该行只有*号,且个数为2l+1
#菱形的上三角形的输出
i=1
while [ $i -le $l ]
do
j=1
while [ $j -le $(($l-$i)) ]
do
echo -n " "
let j++ #循环变量j加一
done
while [ $j -gt $(($l-$i)) ] && [ $j -le $(($l+$i-1)) ]
do
echo -n "*"
let j++
done
echo " " #进行换行
i=$((i+1)) #循环变量i加一
done
#菱形的下三角形的输出
#此时无需对循环变量i赋初值,沿用上一个循环最后的循环变量值即可,即 i=l+1
#也可以采用该命令进行赋初值 i=$(($l+1))
while [ $i -gt $l ] && [ $i -lt $((2*$l+1)) ]
do
#j=$l
j=1
while [ $j -le $(($i-$l)) ]
do
echo -n " "
let j++
done
while [ $j -gt $(($i-$l)) ] && [ $j -le $((3*$l-$i-1)) ] #j>=i-j且j<=2l-(i-l)-1=3l-i-1
do
echo -n "*"
let j++
done
echo " " #进行换行
i=$((i+1)) #循环变量i加一
done
~/shell$ bash while.sh
请输入菱形的对角线长度的一半:6
*
***
*****
*******
*********
***********
*********
*******
*****
***
*
实例4:输出九九乘法表
~/shell$ cat while.sh
#!/bin/bash
i=1
while [ $i -le 9 ]
do
j=1
while [ $j -le $i ]
do
sum=$(($i*$j))
echo -n "$j * $i = $sum "
#echo -n " "
let j++ #循环变量j加一
done
echo " " #进行换行
i=$((i+1)) #循环变量i加一
done
~/shell$ bash while.sh
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16
1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25
1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36
1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49
1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64
1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81
for循环语句和while循环语句的区别与联系:
for循环和while循环可以实现相同的功能,不同之处在于它们的语法结构和用法有所区别。
for循环的语法结构如下:
for 变量名 in 取值列表
do
循环体
done
其中,变量名表示循环变量,取值列表是一组用空格分隔的值,循环变量会依次取这些值执行循环体。
while循环的语法结构如下:
while 条件
do
循环体
done
其中,条件表示循环条件,只要条件成立,就会一直执行循环体。条件一般是一个命令或表达式,返回值为0表示条件成立,非0表示条件不成立。
for循环和while循环的不同之处在于:
1. for循环一般用于已知循环次数的情况下,而while循环适用于不知道循环次数或需要检查某些条件是否成立的情况下。
2. for循环的循环变量是在循环开始前就确定了取值列表,而while循环的条件表达式可以根据循环过程中的结果动态调整。
3. for循环的循环次数是已知的,while循环的循环次数是不确定的。
for循环和while循环的相同之处有:
1.for循环和while循环都可以实现循环执行相同的命令或操作。
2.for循环和while循环都可以嵌套使用,实现多重循环嵌套。