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