shell十三问-13) for what? while 与 until 差在哪

�K於,�淼� shell 十三��的最後一��了...  �L�L吐一口��~~~~

最後要介�B的是 shell script �O�中常�的"循�h"(loop)。
所�^的 loop 就是 script 中的一段在一定�l件下反覆�绦械拇��a。
bash shell  中常用的 loop 有如下三�N:
* for
* while
* until

for loop 是�囊��清�瘟斜碇凶x�M�量值,�K"依次"的循�h�绦� do 到 done 之�g的命令行。
例:
 

  1. for var in one two three four five
     
  2. do
     
  3.     echo -----------
     
  4.     echo '$var is '$var
     
  5.     echo
     
  6. done
复制代码


上例的�绦薪Y果���是:
 

    1) for ��定�x一��叫 var 的�量,其值依次是 one two three four five 。
    2) 因�橛� 5 ���量值,因此 do �c done 之�g的命令行��被循�h�绦� 5 次。
    3) 每次循�h均用 echo �a生三行句子。
         而第二行中不在 hard quote 之�鹊� $var ��依次被替�Q�� one two three four five 。
    4) ��最後一���量值�理完��,循�h�Y束。



我��不�y看出,在  for loop 中,�量值的多寡,�Q定循�h的次�怠�
然而,�量在循�h中是否使用�t不一定,得��O�需求而定。
倘若 for loop �]有使用 in �@�� keyword �碇付ㄗ�量值清�蔚脑�,其值��� $@ (或 $* )中�^承:
 

  1. for var; do
     
  2.     ....
     
  3. done
复制代码


(若你忘�了 positional parameter ,��亓�第 9 章...)

for loop 用於�理"清��"(list)�目非常方便,
其清�纬�了可明�_指定或�� positional parameter 取得之外,
也可�淖�量替�Q或命令替�Q取得... (再一次提醒:�e忘了命令行的"重�M"特性�u)
然而,��於一些"累��化"的�目(如整�导�p),for 亦能�理:
 

  1. for ((i=1;i<=10;i++))
     
  2. do
     
  3.    echo "num is $i"
     
  4. done
复制代码



除了 for loop ,上面的例子我��也可改用  while loop �碜龅剑�
 

  1. num=1
     
  2. while [ "$num" -le 10 ]; do
     
  3.     echo "num is $num"
     
  4.     num=$(($num + 1))
     
  5. done
复制代码



while loop 的原理�c for loop 稍有不同:
它不是逐次�理清�沃械淖�量值,而是取�Q於 while 後面的命令行之 return value :
* 若�� ture ,�t�绦� do �c done 之�g的命令,然後重新判�� while 後的 return value 。
* 若�� false ,�t不再�绦� do �c done 之�g的命令而�Y束循�h。

分析上例:
 

    1) 在 while 之前,定�x�量 num=1 。
    2) 然後�y�(test) $num 是否小於或等於 10 。
    3) �Y果�� true ,於是�绦� echo �K�� num 的值加一。
    4) 再作第二��y�,此�r num 的值�� 1+1=2 ,依然小於或等於 10,因此��  true ,�^�m循�h。
    5) 直到 num �� 10+1=11 �r,�y�才��失��... 於是�Y束循�h。



我��不�y�l�F:
* 若 while 的�y��Y果永�h�� true 的�,那循�h�⒁恢庇谰�绦邢氯ィ�
 

  1. while :; do
     
  2.     echo looping...
     
  3. done
复制代码


上例的" : "是 bash 的 null command ,不做任何�幼鳎�除了送回 true 的 return value 。
因此�@��循�h不���Y束,�Q作死循�h。
死循�h的�a生有可能是故意�O�的(如跑 daemon),也可能是�O��e�`。
若要�Y束死�きh,可透�^ signal �斫K止(如按下 ctrl-c )。
(�P於 process �c signal ,等日後有�C��再�a充,十三����r略�^。)

一旦你能�蚶斫� while loop 的�,那,就能理解 until loop :
* �c while 相反,until 是在 return value �� false �r�M入循�h,否�t�Y束。
因此,前面的例子我��也可以�p�的用  until ���:
 

  1. num=1
     
  2. until [ ! "$num" -le 10 ]; do
     
  3.     echo "num is $num"
     
  4.     num=$(($num + 1))
     
  5. done
复制代码


或是:
 

  1. num=1
     
  2. until [ "$num" -gt 10 ]; do
     
  3.     echo "num is $num"
     
  4.     num=$(($num + 1))
     
  5. done
复制代码



okay ,�P於 bash 的三��常用的 loop ��r介�B到�@�e。
在�Y束本章之前,再跟大家�a充����c loop 有�P的命令:
*  break
* continue
�@���命令常用在�}合式循�h�e,也就是在 do ... done 之�g又有更�M一�拥� loop ,
��然,用在�我谎��h中也未�L不可啦...  ^_^

break 是用�泶�嘌��h,也就是"��迫�Y束" 循�h。
若 break 後面指定一���抵� n 的�,�t"�难e向外"打�嗟� n ��循�h,
�A�O值�� break 1 ,也就是打�喈�前的循�h。
在使用 break �r需要注意的是, 它�c return 及 exit 是不同的:
* break 是�Y束 loop
* return 是�Y束 function
* exit 是�Y束 script/shell

而 continue �t�c break 相反:��迫�M入下一次循�h�幼鳌�
若你理解不�淼脑�,那你可��蔚目闯桑涸� continue 到 done 之�g的句子略�^而返回循�h�端...
�c break 相同的是:continue 後面也可指定一���抵� n ,以�Q定�^�m哪一��(�难e向外�算)的循�h,
�A�O值�� continue 1 ,也就是�^�m��前的循�h。

在 shell script �O�中,若能善用 loop ,�⒛艽蠓�度提高 script 在�}�s�l件下的�理能力。
�多加��吧....


-----------

好了,�是到了�Y束的�r候了。
婆婆����的跟大家�铀袅艘欢殃P於 shell 的基�A概念,
目的不是要告�V大家"答案",而是要�Ыo大家"���l"...
在日後�P於 shell 的��中,我或�S���常用"�接"方式指引回�硎�三��中的�热荩�
以便我��在�M行技�g探��r彼此能有一些��基�A,而不至於各�f各�、徒�M�r力。
但,更希望十三��能�Ыo你更多的思考�c�啡ぃ�至�橹匾�的是透�^��作�砑由罾斫狻�

是的,我很重�"��作"�c"��立思考"�@�身��W�要素,若你能�蛘莆掌渲姓媪x,那�容我�f�:
--- 恭喜�u十三��你�]白看了�u  ^_^
 

你可能感兴趣的:(shell,十三问)