Bash Shell 中的while 循环、 do...while


 

        此链接通往 Bash Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:


while 循环的语法结构 和 一些例子:

语法结构:

while (expresssion)
do
  cmd
done


while 循环 : 当表达式成立的时候,执行 cmd 。

提到了 while 循环 就当然 想到了 do..while 循环 ,这两个可不一样!


——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
当然,还可以使用  while truewhilewhile true(或 :)
do 
循环体
done   

true 命令为真  :一样!
root@zhengzelin:~# true
root@zhengzelin:~# echo $?
0
root@zhengzelin:~# type true 
true is a shell builtin

root@zhengzelin:~# :
root@zhengzelin:~# echo $?
0
root@zhengzelin:~# type :
: is a shell builtin


———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

while 循环 基本上语法就是这样,不过一般使用的话,你得声明变量:

比如让你输出 1 - 100 的数字!

你如果使用 for 类C风格的语法时:
for((i=1;i<=100;i++));do echo $i;done

当你使用 while 的时候:
a=1;while((a<=100));do echo $a; let a++;done
a=1;while [[ $a -le 100 ]];do echo $a; let a++;done

上面的三个表达式 对应 的相当于 for(()) 里面的三个表达式,这样就很通俗易懂了吧!
a=1 对应 i=1 (当然,a 和 i 是变量名 ,任何数都可以)
a<=100 对应 i<=100
let a++ 对应 i++

1、求 10 以内每个整数的平方值:

#!/bin/bash
sum=1
while [ $sum -le 10 ]
do
   pf=$(expr $sum \* $sum)        # 可换成 let pf=sum*sum                                                                                        
      echo $pf
  sum=$( expr $sum + 1 )   # 可以换成 let sum++
done
# 这里的 pf=$(expr $sum \* $sum)    可以替换为 :pf=$[$sum**2] 
    
root@zhengzelin:~# ./d.sh 
1
4
9
16
25
36
49
64
81
100
root@zhengzelin:~# bash -x d.sh 
+ sum=1
+ '[' 1 -le 10 ']'
++ expr 1 '*' 1
+ pf=1
+ echo 1
1
++ expr 1 + 1
+ sum=2
+ '[' 2 -le 10 ']'
++ expr 2 '*' 2
+ pf=4
+ echo 4
4
++ expr 2 + 1
+ sum=3
+ '[' 3 -le 10 ']'
++ expr 3 '*' 3
+ pf=9
+ echo 9
9
++ expr 3 + 1
+ sum=4
+ '[' 4 -le 10 ']'
++ expr 4 '*' 4
+ pf=16
+ echo 16
16
++ expr 4 + 1
+ sum=5
+ '[' 5 -le 10 ']'
++ expr 5 '*' 5
+ pf=25
+ echo 25
25
++ expr 5 + 1
+ sum=6
+ '[' 6 -le 10 ']'
++ expr 6 '*' 6
+ pf=36
+ echo 36
36
++ expr 6 + 1
+ sum=7
+ '[' 7 -le 10 ']'
++ expr 7 '*' 7
+ pf=49
+ echo 49
49
++ expr 7 + 1
+ sum=8
+ '[' 8 -le 10 ']'
++ expr 8 '*' 8
+ pf=64
+ echo 64
64
++ expr 8 + 1
+ sum=9
+ '[' 9 -le 10 ']'
++ expr 9 '*' 9
+ pf=81
+ echo 81
81
++ expr 9 + 1
+ sum=10
+ '[' 10 -le 10 ']'
++ expr 10 '*' 10
+ pf=100
+ echo 100
100
++ expr 10 + 1
+ sum=11
+ '[' 11 -le 10 ']'

2、使用 while 循环 的嵌套来实现打印三角形:

root@zhengzelin:~# vim d.sh 
#!/bin/bash    
a=1
while [ $a -le  5 ] 
do
        b=1
        while [ $b -le $a ]
        do
          echo -n "*"
          let b++        
          done
echo
let a++
done

root@zhengzelin:~# ./d.sh 
*
**
***
****
*****

root@zhengzelin:~# bash -x d.sh 
+ a=1
+ '[' 1 -le 5 ']'
+ b=1
+ '[' 1 -le 1 ']'
+ echo -n '*'
*+ let b++
+ '[' 2 -le 1 ']'
+ echo

+ let a++
+ '[' 2 -le 5 ']'
+ b=1
+ '[' 1 -le 2 ']'
+ echo -n '*'
*+ let b++
+ '[' 2 -le 2 ']'
+ echo -n '*'
*+ let b++
+ '[' 3 -le 2 ']'
+ echo

+ let a++
+ '[' 3 -le 5 ']'
+ b=1
+ '[' 1 -le 3 ']'
+ echo -n '*'
*+ let b++
+ '[' 2 -le 3 ']'
+ echo -n '*'
*+ let b++
+ '[' 3 -le 3 ']'
+ echo -n '*'
*+ let b++
+ '[' 4 -le 3 ']'
+ echo

+ let a++
+ '[' 4 -le 5 ']'
+ b=1
+ '[' 1 -le 4 ']'
+ echo -n '*'
*+ let b++
+ '[' 2 -le 4 ']'
+ echo -n '*'
*+ let b++
+ '[' 3 -le 4 ']'
+ echo -n '*'
*+ let b++
+ '[' 4 -le 4 ']'
+ echo -n '*'
*+ let b++
+ '[' 5 -le 4 ']'
+ echo

+ let a++
+ '[' 5 -le 5 ']'
+ b=1
+ '[' 1 -le 5 ']'
+ echo -n '*'
*+ let b++
+ '[' 2 -le 5 ']'
+ echo -n '*'
*+ let b++
+ '[' 3 -le 5 ']'
+ echo -n '*'
*+ let b++
+ '[' 4 -le 5 ']'
+ echo -n '*'
*+ let b++
+ '[' 5 -le 5 ']'
+ echo -n '*'
*+ let b++
+ '[' 6 -le 5 ']'
+ echo

+ let a++
+ '[' 6 -le 5 ']'

do…while 语法:

do 
{ 循环体... }
while (条件表达式);   # 注意 分号 ";" !



再来看一下 while 循环的语法结构:

while (条件表达式)
do
循环体
done


双方对比:
1、do... while 是先执行一次 循环体 然后再查看 条件表达式是否成立;成立则返回循环体继续执行,不成立则退出!
2、 while 循环 是 先判断 条件表达式是否成立,成立则执行 循环体,不成立则退出!

也就是说 不管条件表达式是否为true;do...while 最少会执行一次 循环体,而 while 却可能一次都不会执行!

 

关于 while 嵌套 打印 等腰三角形 或 九九乘法表 在其他文章可以看见!

while 循环 嵌套打印 九九乘法表

发布了99 篇原创文章 · 获赞 72 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ljlfather/article/details/105284996