while、和for循环被称为直到型循环,而until循环则是典型的当型循环。所谓直到型循环则是,关于条件满足的时候执行do命令序列而当型循环则是说当条件不满足的时候执行命令序列,
一、while循环语句结构
<a href="http://s2.51cto.com/wyfs02/M00/86/36/wKiom1e4SoXBrB3dAAQ-tR3Mad8128.png-wh_500x0-wm_3-wmp_4-s_4217062516.png" target="_blank"></a>
二、语法结构
while 条件
do
命令
done
关于while循环的使用过程中要避免程序陷入死循环,
三、应用举例
求1-10的自然数的平方。
<code>#!/bin/bash</code>
<code>num=1</code>
<code>while</code> <code>[ $num -</code><code>le</code> <code>10 ]</code>
<code> </code><code>do</code>
<code> </code><code>square=$(</code><code>expr</code> <code>$num \* $num)</code>
<code> </code><code>echo</code> <code>"$square"</code>
<code> </code><code>let</code> <code>num++</code>
<code> </code><code>done</code>
执行结果:
<code>[root@node1 </code><code>while</code><code>]</code><code># sh while.sh </code>
<code>1</code>
<code>4</code>
<code>9</code>
<code>16</code>
<code>25</code>
<code>36</code>
<code>49</code>
<code>64</code>
<code>81</code>
<code>100</code>
要求:输出100以内2的次幂
<code>echo</code>
<code>var=1</code>
<code>while</code><code>((var<=100))</code>
<code> </code><code>do</code>
<code> </code><code>echo</code> <code>"输入的数值是:$var"</code>
<code> </code><code>((var=var*2))</code>
<code>echo</code>
<code>echo</code> <code>"成功循环输出"</code>
<code>[root@node1 </code><code>while</code><code>]</code><code># sh 100.sh </code>
<code>输入的数值是:1</code>
<code>输入的数值是:2</code>
<code>输入的数值是:4</code>
<code>输入的数值是:8</code>
<code>输入的数值是:16</code>
<code>输入的数值是:32</code>
<code>输入的数值是:64</code>
<code>成功循环输出</code>
<code>[root@node1 </code><code>while</code><code>]</code><code>#</code>
注:直接使用echo可以输出空行。
在shell编辑的过程中如果需要使用“[]”,必须保证运算符与算数之间有空格,四则运算必须使用expr命令配合完成运算。而双括号的引入,使shell在算术运算的使用中,很好的完成了shell中算术及赋值运算。
其使用方法如下:((表达式1,表达式2……))
特点:
1、所有变量可以不加入"$"前缀。
2、在双括号结构中,可以使表达式像C语言一样使用,a++,b--,a=a+1等应用。
3、双括号可以进行逻辑运算,四则运算。
4、支持多个表达式运算,而各个表达式之间只需要使用“,”隔开即可。
5、能够扩展for,while和if条件测试预算。
<code>read</code> <code>-p </code><code>"请输入符号:"</code> <code>char</code>
<code>read</code> <code>-p </code><code>"请输入行数:"</code> <code>num</code>
<code>a=1</code>
<code>while</code> <code>[ $a -</code><code>le</code> <code>$num ]</code>
<code>do</code>
<code> </code><code>b=1</code>
<code> </code><code>while</code> <code>[ $b -</code><code>le</code> <code>$a ]</code>
<code> </code><code>echo</code> <code>-n </code><code>"$char"</code>
<code> </code><code>b=`</code><code>expr</code> <code>$b + 1`</code>
<code> </code><code>echo</code>
<code> </code><code>a=`</code><code>expr</code> <code>$a + 1`</code>
<code>done</code>
<code>[root@node1 </code><code>for</code><code>]</code><code># sh zsj.sh </code>
<code>请输入符号:@</code>
<code>请输入行数:7 </code>
<code>@</code>
<code>@@</code>
<code>@@@</code>
<code>@@@@</code>
<code>@@@@@</code>
<code>@@@@@@</code>
<code>@@@@@@@</code>
注:上例中关于打印三角形的脚本,首先是对行数的控制,然后执行内部循环控制每行输出的符号个数。对于echo -n 其中-n选项表示本次输出不输出换行符,
对于打印正三角形时需要通过两侧内层循环分别输出打印符号和打印空格的个数等进行输出。其实例如下。
<code>#!/bin/sh</code>
<code> </code><code>b=`</code><code>expr</code> <code>$num - $a`</code>
<code> </code><code>while</code> <code>[ $b -gt 0 ]</code>
<code> </code><code>do</code>
<code> </code><code>echo</code> <code>-n </code><code>" "</code>
<code> </code><code>b=`</code><code>expr</code> <code>$b - 1`</code>
<code> </code><code>c=1</code>
<code> </code><code>while</code> <code>[ $c -</code><code>le</code> <code>`</code><code>expr</code> <code>$a \* 2 - 1` ]</code>
<code> </code><code>echo</code> <code>-n </code><code>"$char"</code>
<code> </code><code>((c++))</code>
<code>执行结果:</code>
<code>[root@node1 </code><code>shift</code><code>]</code><code># ./zsj_wihle.sh </code>
<code>请输入符号:*</code>
<code>请输入行数:5</code>
<code> </code><code>*</code>
<code> </code><code>***</code>
<code> </code><code>*****</code>
<code> </code><code>*******</code>
<code>*********</code>
<code>[root@node1 </code><code>shift</code><code>]</code><code>#</code>
本文转自 CARYFLASH 51CTO博客,原文链接:http://blog.51cto.com/maoxiaoxiong/1840919