shell中for what? while 與 until對比

來源:互聯網
上載者:User


終於,來到 shell 十三問的最後一問了… 長長吐一口氣~~~~

最後要介紹的是 shell script 設計中常見的”迴圈”(loop)。

所謂的 loop 就是 script 中的一段在一定條件下反覆執行的代碼。

bash shell 中常用的 loop 有如下三種:

* for
* while
* until
for loop 是從一個清單列表中讀進變數值,?K”依次”的迴圈執行 do 到 done 之間的命令列。例:

for var in one two three four five
do
    echo -----------
    echo '$var is '$var
    echo
done
上例的執行結果將會是:

1) for 會定義一個叫 var 的變數,其值依次是 one two three four five 。
2) 因為有 5 個變數值,因此 do 與 done 之間的命令列會被迴圈執行 5 次。
3) 每次迴圈均用 echo 產生三行句子。而第二行中不在 hard quote 之?鵲 $var 會依次被替換為 one two three four five 。
4) 當最後一個變數值處理完?,迴圈結束。
我們不難看出,在 for loop 中,變數值的多寡,?Q定迴圈的次數。

然而,變數在迴圈中是否使用則不一定,得視設計需求而定。

倘若 for loop ?]有使用 in 這個 keyword 來指定變數值清單的話,其值將從 $@ (或 $* )中繼承:

for var; do
    ....
done
(若你忘記了 positional parameter ,請複習第 9 章…)

for loop 用於處理”清單”(list)?目非常方便,其清單除了可明確指定或從 positional parameter 取得之外,也可從變數替換或命令替換取得… (再一次提醒:?e忘了命令列的”重組”特性!)

然而,對於一些”累計變化”的?目(如整數加?p),for 亦能處理:

for ((i=1;i<=10;i++))
do
   echo "num is $i"
done
除了 for loop ,上面的例子我們也可改用 while loop 來做到:

num=1
while [ "$num" -le 10 ]; do
    echo "num is $num"
    num=$(($num + 1))
done
while loop 的原理與 for loop 稍有不同:

它不是逐次處理清單中的變數值,而是取?Q於 while 後面的命令列之 return value

* 若為 ture ,則執行 do 與 done 之間的命令,然後重新判斷 while 後的 return value 。
* 若為 false ,則不再執行 do 與 done 之間的命令而結束迴圈。
分析上例:

1) 在 while 之前,定義變數 num=1 。
2) 然後測試(test) $num 是否小於或等於 10 。
3) 結果為 true ,於是執行 echo ?K將 num 的值加一。
4) 再作第二?測試,此時 num 的值為 1+1=2 ,依然小於或等於 10,因此為 true ,繼續迴圈。
5) 直到 num 為 10+1=11 時,測試才會失??hellip; 於是結束迴圈。
我們不難發現:

* 若 while 的測試結果永遠為 true 的話,那迴圈將一直永久執行下去:

while :; do
    echo looping...
done
上例的” : “是 bash 的 null command ,不做任何動作,除了送回 true 的 return value。因此這個迴圈不會結束,稱作死迴圈。

死迴圈的產生有可能是故意設計的(如跑 daemon),也可能是設計錯誤。

若要結束死迴圈,可透過 signal 來終止(如按下 ctrl-c )。

(關於 process 與 signal ,等日後有機會再補充,十三問暫時略過。)

一旦你能夠理解 while loop 的話,那,就能理解 until loop

* 與 while 相反,until 是在 return value 為 false 時進入迴圈,否則結束。
因此,前面的例子我們也可以輕鬆的用 until 來寫:

num=1
until [ ! "$num" -le 10 ]; do
    echo "num is $num"
    num=$(($num + 1))
done
或是:

num=1
until [ "$num" -gt 10 ]; do
    echo "num is $num"
    num=$(($num + 1))
done
okay ,關於 bash 的三個常用的 loop 暫時介紹到這裡。

在結束本章之前,再跟大家?充兩個與 loop 有關的命令:

break
continue
這兩個命令常用在複合式迴圈裡,也就是在 do … done 之間又有更進一層的 loop ,當然,用在單一迴圈中也未嘗不可啦… ^_^

break 是用來打斷迴圈,也就是”??迫結束” 迴圈。

若 break 後面指定一個數值 n 的話,則”從裡向外”打斷第 n 個迴圈,預設值為 break 1 ,也就是打斷當前的迴圈。

在使用 break 時需要注意的是, 它與 return 及 exit 是不同的:

* break 是結束 loop
* return 是結束 function
* exit 是結束 script/shell
而 continue 則與 break 相反:強迫進入下一次迴圈動作。

若你理解不來的話,那你可簡單的看成:在 continue 到 done 之間的句子略過而返回迴圈頂端…

與 break 相同的是:continue 後面也可指定一個數值 n ,以?Q定繼續哪一層(從裡向外計算)的迴圈,預設值為 continue 1 ,也就是繼續當前的迴圈。

在 shell script 設計中,若能善用 loop ,將能大幅度提高 script 在複雜條件下的處理能力。

請多加練習吧….

———–

好了,該是到了結束的時候了。

婆婆媽媽的跟大家??鋁艘歡壓賾 shell 的基礎概念,目的不是要告訴大家”答案”,而是要帶給大家”啟發”…

在日後關於 shell 的討論中,我或許會經常用”連結”方式指引回來十三問中的?熱藎?員鬮頤竊誚?屑際跆教質北舜四苡幸恍┨致芻?。??恢劣詬魎蹈骰啊⑼椒咽繃Α5???M???誓艽??愀?嗟乃伎加肜秩ぃ?廖?匾?氖峭腹?底骼醇由罾斫狻?/p>

是的,我很重視”實作”與”獨立思考”這兩項學習要素,若你能夠掌握其中真義,那請容我說聲:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.