關(guān)于編程的幾個術(shù)語
輸送給計算機的單一一條指令稱之為命令——command
集合在一起的多個命令稱之為代碼——code
為了完成某項任務(wù)而組織在一起的所有指令統(tǒng)稱為程序——program
Linux中bash shell語音保留的關(guān)鍵字:
case | elif | let |
clear | else | read |
continue | if | then |
echo | for in | while |
變量
什么是數(shù)據(jù)?
程序從預(yù)付那兒獲得的信息成為數(shù)據(jù)——data。一個好的程序遵從了下面三個步驟:
1. 從硬盤或文件中獲得數(shù)據(jù)
2. 對數(shù)據(jù)進(jìn)行某種適當(dāng)?shù)奶幚?/p>
3. 把數(shù)據(jù)顯示在屏幕上火存放在一個文件中
字符串——string
字符串其實就是多個字母或字符的集合。一個字符即可能是一個連字符,也可能是在鍵盤上所能發(fā)現(xiàn)的任何東西。字符串也可能經(jīng)由單一字母或字符組成。一個完整的句子可能是一個字符串。事實上,任何字母、空格、甚至是數(shù)字的組合,都可以看成是一個字符串。
數(shù)——number
一個數(shù)可由任何數(shù)字組成,如金錢數(shù)、某人的年齡或者身高、體重等。數(shù)既可以是負(fù)數(shù)也可以是正數(shù)、整數(shù)、分?jǐn)?shù)、小數(shù)。在復(fù)雜一點,數(shù)也可以是字符。數(shù)的這種雙重身份可能讓我們感到疑惑,但是它無法欺騙計算機。如果告訴計算機是某個地址或電話號碼的一部分,那么它就會把該數(shù)當(dāng)做一個字母或字符。但是,如果讓計算機把某數(shù)加起來,那么計算機就會把它當(dāng)做數(shù)而不是字符。
理解什么是變量和值
計算機是知道如何區(qū)分用戶輸入的數(shù)據(jù)和字符串,但對人來說可能就像“迷×魂×湯”。就對我們讀者而言,很容易把55-55-55當(dāng)做是某個人的保險號,而計算機僅把它當(dāng)做一個數(shù)或一個字符串。
當(dāng)程序要用那個保險號時,它還必須告訴計算機:“現(xiàn)在是用保險號的時候了,你漢子道它放在哪兒了,對嗎?它就放在變量名為SSS下了”
所謂的變量——variable,其實就是計算機中某一特定數(shù)的值(如保險號)的地方。而輸給這個變量名sss的保險號就是一個值。
變量的分類
Linux使用下列兩種分類:
局部變量:有程序員自己建立,且僅供程序員所設(shè)計的程序使用。
環(huán)境變量:由程序員或他人建立,程序員和他人的程序都可以使用。
Linux條件控制語句
我們一生都在決定。如,你想到哪兒去旅游,是去美國,日本還是法國?
決定是其實是一種明智的選擇。但是我們得把它們建立在符合某種條件基礎(chǔ)上,如我們有足夠的資金去旅游嗎?如果條件不成立,即使是最讓人神往的選擇也只是一種空想。
條件
條件是一種必須存在或不存在的狀態(tài)。如果存在,則條件為真,否則為假。
Linux中,條件存在有如下兩種表達(dá)形式:
單一變量
一個表達(dá)式
比如說,把所有的錢放進(jìn)錢包(wallet)里。Wallet被稱為變量,錢包里的錢被稱為變量的值。是否去美國夏威夷,得要看自己的錢包中的錢是否足夠。如果不夠,則去不了。因此,錢包這個變量的值是零,這意味著去美國夏威夷旅游的錢不夠,條件為假。
又比如說,錢包里有許多許錢。但對于這次旅行來說這些錢足夠嗎?這得問問我們自己了,看看錢包里的錢是否大于或等于$1000(旅行所需的money)。這就是一個表達(dá)式,它將導(dǎo)致真或假兩種結(jié)果之一。
用變量表示的條件
一個變量的值要么是真要么是假。這通常用非零表示真,零表示假。下面就介紹確定一個變量的值是真還是假的兩種方法。第一種方法顯示檢查變量的值,如下例所示:
If [$HaveEnoughMoney –eq 1]
程序?qū)⒂玫忍査惴? eq)來確定變量的值是真還是假。
如果想判斷一個條件是否是真,也可以讓程序來檢測變量的值是否是假,如下所示:
If [$HaveEnoughMoney – ne 0]
不等于算符(- ne)做出的是一種與邏輯相反的判斷。如果用- eq算符,那么程序?qū)z測該變量是否是真。相反,如果用- ne算符,那么程序?qū)z測該變量是否不真,即假。
用表達(dá)式表示的條件
條件也可以說一個表達(dá)式,它要求程序?qū)π畔?zhí)行的某種操作。譬如,要求程序檢測一個變量(如你的銀行存款,O(∩_∩)O)的值是否大于某一個特定數(shù)。在這種情況下,一個表達(dá)式的結(jié)果也只可能有兩種:真或假,且只能是其中之一,如下例所示:
If [$BankBalance –gt 3000]
-eq | 等于 | -gt | 大于 | -lt | 小于 |
-ne | 不等于 | -ge | 大于或等于 | -le | 小于或等于 |
程序檢測變量BankBalance的值,看它是否大于3000,而這個表達(dá)式只有兩種可能性:真或假。如果存款大于3000,則為真;存款小于3000,則為假。
If語句
當(dāng)需要檢測一個條件是真還是假的時候,就可以使用if語句。If語句僅僅是告訴程序:“如果條件為真,就執(zhí)行這些指令,否則跳過這些指令?!?/p>
If語法的規(guī)則如下:
If {Condition}
Then
Instrution
fi
一般說來,如果Condition存在(即條件Condition為真),程序則執(zhí)行項目的Instruction。
下面列舉兩個例子來說明if語句的用法。第一個例子是讓程序判斷一個盒子是否已經(jīng)裝滿了,條件是盒子最多只能裝下100個小甜餅。
if [$Quantity –eq 100]
then
echo “The box is full”
fi
這個語句讓程序檢測一下變量Quantity的值,看它是否為100.如果是,則在屏幕上顯示:
The box is full.
否則,就跳過這條語句并移到fi的下一條語句。注意,在這里,fi是一個保留字,它有特殊的含義。(fi表示if語句的結(jié)束)
另一個例子,要求程序檢測盒子是否已滿,及是否還有其他的盒子可以獲得。當(dāng)且僅當(dāng)這兩個條件同時是真時,程序才會報告無法在裝甜餅了,如下所示:
if [$Quantity –eq 100] && {$AvailableBoxes –it 1}
then
echo “The box is full and you have no more boxes”
fi
這條語句要求程序檢測一下變量Quantity的值,看它是否100,及變量AvailableBoxes的值是否小于1.如果這兩個條件都為真,則顯示信息:
The box is full and you have no more boxes”
如果變量Quantity的值不是100,且分子也有剩余,程序則跳過這條語句,移到保留字fi的下一條語句。
if else語句
if語句可以使程序一句一個條件來做出某種判斷,如果天哦見是真則執(zhí)行一組規(guī)定的指令。
但是,在使用if語句時也存在著一個問題,即條件是假時,可能還需要為程序提供另外一組指令。當(dāng)然,也可以再用一條if語句來解決這個問題,即在條件為假時讓程序執(zhí)行另一組指令。但是,有一種方法比這更簡單,這就是if else語句。if else語句的語法規(guī)則是:
if [Condition]
then
Instruction1
else
Instruction2
fi
這條語句表示,如果Condition(條件)為真,程序則執(zhí)行第一組指令(IInstruction1);如果Condition(條件)為假,則程序執(zhí)行第二組指令(Instruction2)。
現(xiàn)在進(jìn)行一個小小的測驗,看我們是否知道如何修改下面的語句,以便讓程序在屏幕上顯示信息:
The box is not full?
如下所示:
if [$Quantity –eq 100]
then
echo “The box is full”
fi
可以用如下兩種方法來修改這條語句,這要取決于我們?nèi)绾蝸肀磉_(dá)那個條件。如果想讓條件不變,則可以按如下修改:
if [$Quantity –eq 100]
then
echo “The box is full”
else
echo “The box is not full”
不過,也可以用條件$Quantity –ne 100來修改,如:
if [$Qurantity –ne 100]
then
echo “The box is not full”
else
echo “The box is full”
fi
if else語句
擔(dān)心!如果條件為假時,程序?qū)o條件地執(zhí)行第二組指令。有時,我們并不希望這要。相反,希望程序在執(zhí)行第二組指令前,再做一次判斷。
為了達(dá)到上述目的,可以使用if elif語句來讓計算機再做一次判斷。著看起來似乎有點讓人混淆不清,但在習(xí)慣了之后是相當(dāng)容易理解的。if elif語句的語法規(guī)則如下:
if [Condition1]
then
Instruction1
elif
Instruction2
fi
在這條語句中,如果條件Condition1是真,程序則執(zhí)行第一組指令I(lǐng)nstruction1;否則,程序在判斷條件Condition2是否是真。如果條件不為真,程序則執(zhí)行第二組指令I(lǐng)nstruction2;如果Condition2是假,則跳過第二組指令。
無論什么時候使用if語句,程序至少執(zhí)行一組指令。但是,如果使用的是if elif語句,程序?qū)⒂锌赡芴^這兩組指令,如下例所示:
if [$$Quantity –eq 100]
then
echo “The box is full”
elif [$Quantity –eq 95]
then
echo “You can add 5 cookies to the box”
fi
于是,當(dāng)Quantity的值是95時,會有什么反應(yīng)?首先,程序判斷第一個條件表達(dá)式的值發(fā)現(xiàn)表達(dá)式$Quantity –eq 100的值是假。
然后,程序確定第二個條件表達(dá)式的值,發(fā)現(xiàn)表達(dá)式$Quantity –eq 95是真,因此,程序?qū)@示:
You can add 5 cookies to the box
但是,當(dāng)Quantity的值是94的時候,會有什么結(jié)果呢?
同上所述,程序首先檢測第一個條件表達(dá)式$Quantity –eq 100,并確定該表達(dá)式的值是假,于是程序忽略第一組指令;然后,程序檢測第二個條件表達(dá)式Quantity –eq 95,發(fā)現(xiàn)它也是假,因此再忽略第二組指令。
這時,程序就達(dá)到了if else語句體的最后。由于沒有一個條件是真,所以程序不執(zhí)行任何指令。
用if else語句進(jìn)行多重的選擇
在程序中使用多重if elif語句進(jìn)行條件檢測,程序能處理多種可能。多重if elif語句結(jié)構(gòu)規(guī)則如下:
if [Condition1]
then
Instruction1
elif [Condition2]
then
Instruction2
elif [Condition3]
then
Instruction3
fi
在這條語句中,如果Condition1是真,程序執(zhí)行第一組指令I(lǐng)nstruction1;否則,檢測條件Condition2是否為真。如果條件Condition2是真,則執(zhí)行第二組指令I(lǐng)nstruction2;否則,檢測Condition3是否是真。若條件Condition3為真,則執(zhí)行第三組指令I(lǐng)nstruction3;否則,跳過第三組指令I(lǐng)nstruction3。
注意,在程序中,if elif語句嵌套得越多,就越 眼花繚亂。
保證Linux至少執(zhí)行一組指令
想象一下,如果我們寫了一個結(jié)果龐大的if elif語句,卻發(fā)現(xiàn)它什么也干不了,回事什么感覺?O(∩_∩)O哈哈~,在實際編程中確實有這樣的事兒發(fā)生。不過,要是在if elif語句的最后發(fā)一條elif fi語句,就可以避免這樣的“災(zāi)難”,如下例所示:
if [Condition1]
then
Instruction1
elif
Instruction2
elif
then
Instruction3
elif
Instruction4
fi
在這條語句中,如果Condition1是真,程序執(zhí)行第一組指令I(lǐng)nstruction1;否則,檢測Condition2是否為真。如果條件Condition2是真,則執(zhí)行第二組指令I(lǐng)nstruction2;否則,檢測Condition3是否是真。若條件Condition3是真,則執(zhí)行第三組指令I(lǐng)nstruction3;否則,執(zhí)行第四組指令I(lǐng)nstruction4.
case語句
你是否碰見過這種情況,讓計算機在眾多可能的情況下做一個決定?比如說,讓計算機為公司五個辦公室中的每一個做一次特色服務(wù)。要完成這項任務(wù),程序可能要用一大堆if elif語句,如下所示:
if [$region –eq “1”]
then
echo “Hello, Bob”
elif [$region –eq “2”]
then
echo “hello, Mary”
elif [$region –eq “3”]
then
echo “hello, Joan”
elif [$region –eq “4”]
then
echo “hello, Mike”
elif [$region –eq “5”]
then
echo “hello, Tom”
fi
這個程序讀起來可能有點頭疼——盡管計算機讀它很容易。但是,再想想,如果辦公室增加到20個,處理20條if語句,又會如何呢!
case語句
假設(shè)要設(shè)計這樣一個程序,對每一個辦公室的用戶程序顯示不同的信息。當(dāng)然,讀者完全可以像剛開頭說的那樣設(shè)計這個程序:給給每一個辦公室分配一個號碼,每個號碼對應(yīng)一條特殊的信息。
case語句的功能是:把保留字case右邊的值和閉括號“)”左邊的值比較,其語法規(guī)則如下:
case VariableName in
value1)
Instruction
;;
value2)
Instruction
;;
esac
從上面可以看出,case語句以保留字case開頭,以esac結(jié)尾。它首先檢查變量VariableName的值,如果它與value1相等則執(zhí)行第一組指令集,如果它與value2相等則執(zhí)行第二組指令集以此類推。同時,在每組指令集的最后用兩個分號(;;)。
case $region in
1)
echo “Hello, Bob”
;;
2)
echo “Hello, Mary”
;;
3)
echo “Hello, Joan”
;;
4)
echo “Hello, Mike”
;;
5)
echo “Hello, Tom”
;;
esac
這段代碼很容易閱讀,因為它去掉了重復(fù)的elif。當(dāng)然,只要實際需要還可以加入更多可能的值。實際上case語句使得程序像流水線一樣,讓人很容易看懂。
但是,在使用case語句的時候,必須記住以下幾點:
程序要匹配的值必須包含一個或多個字符
可以用一個變量或值作為程序要匹配的值
一個變量或值的右邊必須以閉括號“)”結(jié)尾
case語句中的默認(rèn)情況
在case語句中,如果用戶沒有給程序提供所需要的匹配值,那么程序就找不到它所要匹配的對象。如果是由程序設(shè)計本人提供程序所必須的匹配值,這種情況有時就不會發(fā)生。但是,若有他人來提供,問題可能就要來了。
假設(shè)又增開了一件辦公室,而我們有沒有時間來更新程序,讓它能夠處理這間新辦公室。這時,程序由于找不到任何匹配值,就將那件新辦公室忽略。
不過,我們完全可以使用保留字符(*)來為此留一條后路,即提供一種默認(rèn)情況,讓程序在此執(zhí)行一些必要的操作。請看如下示例:
case $region in
1)
echo “Hello, Bob”
;;
2)
echo “Hello, Mary”
;;
3)
echo “Hello, Joan”
;;
4)
echo “Hello, Mike”
;;
5)
echo “Hello, Tom”
;;
*)
echo “Sorry, your region is not on my list”
esac
這段代碼。如果$office的值等于某一間辦公室的號碼,那么它就顯示某條適當(dāng)?shù)膯柡蛘Z;如果case語句中沒有與$office相匹配的值,就執(zhí)行最后一條指令,顯示信息:
Sorry, your region is not on my list
多層嵌套控制結(jié)構(gòu)
收到過裝在一個大盒子中禮物嗎?當(dāng)你迅速打開的時候,里面還有一個稍小的盒子。哎打開這個小盒子,發(fā)現(xiàn)里面又有一個小盒子。。。。。。直至找到禮物。
在編程的過程中,盒子中又有盒子的現(xiàn)象稱為嵌套(nesting)。如果把多個if語句或case語句組合到一起,就是嵌套了。
if嵌套結(jié)構(gòu)
通常情況下,一個if語句要包含一條或多條指令,如下例所示:
if [$office –eq “1”]
then
echo “hello, Bob”
else
echo “Sorry, your region is not on my first”
fi
下面,再用case語句代替if語句重寫上一個例子:
case $office in
“1”)
echo “Hello, Bob”
;;
*)
echo “sorry, your region is not on my list”
esac
當(dāng)然,也可以不在if或case語句中放入一大堆命令,而在其中再放入其他的if和case語句。下面是一個使用if語句的例子:
if [$office –eq “1”]
then
if [$RegionalMgr –eq “Bob”]
then
echo “Hello, Bob”
fi
此程序首先檢查變量$office的值。如果它是1,則再檢查變量$RegionalMgr的值。如果它的值是Bob,這顯示歡迎Bob的問候語。
case嵌套結(jié)構(gòu)
case語句同樣可以嵌套(與上例的方法相同),請看下面的例子:
case $office in
“1”)
case $RegionalMgr in
“Bob”)
echo “Hello, Bob”
;;
esac
;;
esac
while循環(huán)
while循環(huán)的執(zhí)行過程,如果站在屋檐下躲雨的人們,經(jīng)常需要檢查雨是否還在下一樣。如果雨還在下,他們就得繼續(xù)呆著,否則就可以開車走。在這里,雨就是一個條件,決定著他們是否能走。
我們也可以寫出一個程序,讓用戶在繼續(xù)運行本程序之前先不斷回答一個問題,一直到問題回答正確為止。用戶沒回答一次,程序就檢查一次,看是否與正確答案相同。這種檢查類似于站在屋檐下的人看天空是否還在下雨一樣。如果程序發(fā)現(xiàn)了用戶的答案不對,就告訴他回答不正確,并返回到while循環(huán)的頂部,等待下一次回答。
while循環(huán)的一般格式如下:
while [Condition]
do
Instruction
done
下面,我們將學(xué)習(xí)while循環(huán)的用法,以便程序僅當(dāng)滿足某一特定條件時——譬如用戶從鍵盤上輸入的回答正確的時,程序才執(zhí)行某部分指令。
在while循環(huán)中,必須放入一個倒置結(jié)果為真或假的變量或表達(dá)式,而在while循環(huán)體中則可以放入任意多的指令。
確定是否使用while循環(huán)
在編寫程序的時候,我們一般會列出計算機需要運行的全部指令,其中的一部分指令需要重復(fù)執(zhí)行多次。這時,往往不是把那些指令在重寫,而是把它們放在一個稱之為while的循環(huán)之中。
如果需要重復(fù)執(zhí)行某一組指令,且條件是真,就可以使用while循環(huán)。例如,設(shè)計一個提示用戶輸入密碼的程序,就可以把那些指令放入一個while循環(huán)之中,直至用戶輸入的密碼正確才終止重復(fù)運行。
不過,如果你不想程序連續(xù)地重復(fù)執(zhí)行某一部分指令,就不要使用while循環(huán)。比如,當(dāng)用戶在使用程序出現(xiàn)錯誤的時候,我們總想讓計算機把統(tǒng)一錯誤信息在屏幕上顯示出來。顯然顯示該出錯信息的指令在程序中重復(fù)執(zhí)行,但僅當(dāng)錯誤發(fā)生時,指令才會重復(fù)執(zhí)行。若把這些指令放入一個while循環(huán)中,必將導(dǎo)致程序連續(xù)不斷地顯示該信息。而要解決這個問題的最好辦法就是把這些指令放入一個子程序中,僅當(dāng)需要顯示該信息的時候,程序才調(diào)用該子程序。
while循環(huán)在Linux代碼中的使用
當(dāng)程序遇到一個while循環(huán)時,首先檢測它的條件,詢問它“這個東西是真還是假?”僅當(dāng)條件為真時,程序才會讀入while循環(huán)體中的指令。
請看下面的演示while循環(huán)的例子:
declare raining=”1”
while [“$raining” –eq “1”]
do
echo “Still raining”
done
關(guān)于這個while循環(huán)中的指令具體說明如下:
declare聲明建立一個名為raining的字符串變量,并將它賦值為1。這個值表面是一個真值。
關(guān)鍵字while指示程序檢測$raining的值是否仍然是1。如果是,則意味著雨還在下。如果雨還在下,echo將信息Still raining顯示在屏幕上。
done是while循環(huán)的結(jié)束。
當(dāng)然,為使這個程序有點實際意義,還需要在這個例子中增加一些指令。例如,在上面的例子中,由于$raining的值從不改變,程序總是顯示該信息。提醒讀者注意,上述程序是一個死循環(huán),因此while循環(huán)的條件永遠(yuǎn)都是真。
為了避免死循環(huán)的發(fā)生,需要在程序中增加一些指令,以檢查雨是否還在下。譬如,在while循環(huán)設(shè)置一些指令,當(dāng)雨停止時將$raining的值為0。
for in循環(huán)
假設(shè)你中了大獎,想寫信邀請朋友來參加一個慶祝會。你可能會寫一個程序來打印這些信件,結(jié)果卻發(fā)現(xiàn)程序沒運行一次,都要求輸入一個朋友的名字。
如果使用for in循環(huán),就可以避免這類問題。因為for in循環(huán)可以讓你把所有朋友的名字都存放一個列表中,然后讓程序一句每個人的名字來打印這些邀請信。這有點類似于郵件合并。因此,當(dāng)想讓程序在條件為真時執(zhí)行一系列的指令,就是用while循環(huán)。它會一直運行到程序中有一條指令條件修改為假時終止。
但是,如果知道循環(huán)體中指令執(zhí)行的具體次數(shù),那么久使用for in循環(huán)。
for in循環(huán)一般格式如下:
for VariableName in wordlist
do
Instruction
done
wordlist是一個將賦給變量(VariableName)的字符串值的列表。循環(huán)體中的指令可以使用該變量。
在循環(huán)體中究竟放入多少指令,取決于程序的實際需要。而你所遇到的最大挑戰(zhàn),就是是否掌握了那些程序指令。
什么是否使用for in循環(huán)
沒有什么準(zhǔn)則可以表明什么時候使用for in循環(huán),這需要自己分析。
不過,下面兩種情況常常需要使用for in循環(huán):
需要對多個字符值做同樣操作
需要按照某一確定的次序使用字符串值系列
例如,用一個程序給5個雇員加薪水,必然會遵循下列步驟:
1. 在工資表中查找一個雇員的工資
2. 計算新的薪水
3. 將新的薪水存入工資表
可以先把每個雇員的名字放在一個與for in循環(huán)相聯(lián)系的列表中。然后,按照雇員的名字順序,讓程序查找他們的記錄,進(jìn)行一些必要的數(shù)學(xué)運算,及把記錄重新放入工資文件中。
如何使用for in循環(huán)
如果你想在朋友前面炫耀下一番新學(xué)習(xí)到的編程知識,不妨寫一個程序,當(dāng)他們聚在計算機面前顯示,分別顯示對他們的問候語。要寫這個程序,有許多不同的方法。
請先看下面的示例:
echo “Hello, Mary”
echo “Hello, Joe”
echo “Hello, Sue”
這段程序僅僅是將同一指令重復(fù)三次,變換一下其中的名字。
再用另一種寫法重寫上面的例子,請看:
let counter=1
while [“$counter” –it 5]
do
if [“$counter” –eq 1]
then
echo “hello, Mary”
fi
if [“$counter” –eq 2]
then
echo “hello, Joe”
fi
if [“$counter” –eq 3]
then
echo “hello, Sue”
fi
done
現(xiàn)將上面程序有關(guān)指令說明如下:
while循環(huán)中的指令每執(zhí)行一次,計算機就檢查counter的值一次。
顯示對某一個人的歡迎信息取決于counter的值。
while循環(huán)體中的最后一條指令(let counter=$counter + 1)是給$counter的值加1.并將新值重新賦給counter。這條指令能讓計算機顯示對所有人的信息。
在所有這些指令都執(zhí)行完成以后,計算機檢測counter的值看它是否小于5。若小于5,則在執(zhí)行一次。若大于5或等于5,循環(huán)中止。
上一個程序共用了16行代碼,再看下面使用for in循環(huán)的例子,它僅用了3行就取得了同樣的結(jié)果。
請看下面for in循環(huán)寫成的例子:
do
echo “hello, $friend”
done
在for in循環(huán)的第一行,在for friend in后面緊跟著3個人的人名,這樣就建立了一個單詞表,以后就可以把這些名字當(dāng)做值賦給變量friend。
注意,在$friend和句號之間有一個空格,如果沒有留這個空格,程序?qū)⒏鶕?jù)friend。(有句號)而不是friend(無句號)來尋找變量的。
這個程序的運行過程如下:
1. 計算機從單詞表中取出第一個值,并將它賦給變量friend。
2. 然后,計算機將歡迎詞顯示在屏幕上。
3. 計算機返回,再取第二個值將它賦給friend。
這個程序一直運行到單詞表中的值使用完,也即問候完了所有人之后,for in循環(huán)中止。
因此,通過for in循環(huán)的使用,可以把用while循環(huán)寫的程序代碼從16行縮減到3行,而且程序讀起來更容易。
使用單詞表
賦給變量的那些值統(tǒng)稱為單詞表(wordlist)。它是一個關(guān)于字符串值(字符和數(shù)字的組合)的列表,我們可以按順序從中一次取一個值賦給變量。
關(guān)于單詞表有以下幾點值得注意:
賦給單詞表的值必須是一個字符串的值
每一個值之間必須用空格隔開
如果空格也是字符串的一部分,則需要在字符串的兩邊加上引號
為了說明含空格的字符串的用法,請看下面的例子:
for friend in “Mary” “Joe” “Sue”
do
echo “hello, $friend”
done
循環(huán)嵌套與快速退出
還記得什么時候媽媽叫你清潔玩具嗎?抱怨一陣子之后,你不得不抓起玩具把它們?nèi)M(jìn)玩具箱內(nèi)。你一遍一遍地重復(fù)著這個動作,可以由于每個玩具都是由許多積木平成的,再把它放進(jìn)玩具箱之前,需要把積木放在各自的包裝盒內(nèi)。
在本例中,拿玩具相當(dāng)于外層循環(huán)(outside loop),拿積木相當(dāng)于內(nèi)層循環(huán)(indside loop)。在一個循環(huán)之中又嵌入另一循環(huán)形成一個總的循環(huán)系列,稱之為嵌套循環(huán)(nested loop)。嵌套循環(huán)的使用,使得程序組織起來更容易,盡管讀起來有點費勁。
使用嵌套循環(huán)
嵌套循環(huán)表示的是一個外層虛幻每執(zhí)行一次,內(nèi)需和就執(zhí)行許多次。請看下面包含一個嵌套循環(huán)的例子:
let flag=1
while [“$flah” –lt 4]
do
for friend in Bob Mary Sue
echo “hello, $friend”
done
let flag=”$flag + 1”
總而言之,屏幕上將顯示歡迎Bob、Mary、Sue的信息三次。這個程序包含兩個循環(huán):while循環(huán)和for in循環(huán)。while循環(huán)(外層循環(huán))共循環(huán)三次,而內(nèi)層循環(huán)即嵌套循環(huán)的for in循環(huán),在while循環(huán)每循環(huán)一次,就很不現(xiàn)實對每個人的問候語。
現(xiàn)將程序的有關(guān)指令按順序說明如下:
let flag=1定義了一個數(shù)字變量,并給它賦值為1。
while [“$flag” –lt 4]檢測$flag的值,若它的值為1,程序則執(zhí)行while循環(huán)體內(nèi)的指令。
for friend in Bob Mary Sue是嵌套循環(huán)的起始部分,它把單詞表中的每一個值(Bob Mary Sue)賦給變量friend。
echo “hello, $friend”顯示歡迎變量$friend的值的問候語
第一個done表示它是for in循環(huán)的結(jié)尾。
let flag=”$flag + 1”表示給變量$flag加1并重新賦值給變量flag。
第二個done表示while循環(huán)的結(jié)尾。