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