Presentation is loading. Please wait.

Presentation is loading. Please wait.

Shell Script 程式設計.

Similar presentations


Presentation on theme: "Shell Script 程式設計."— Presentation transcript:

1 Shell Script 程式設計

2 前言 藉由執行一連串的指令而得到輸出結果時, 可以把這些指令的組合事先寫入一個檔案裡, 而這個檔案就叫做 script file 。
其指令可分為系統指令和 shell 指令: 系統指令:ls、cat、rm 指令。 shell 指令:由 shell 直接解譯的指令, 通常用於 script 檔程式流程的控制,ex:分支 (case...)、迴圈 (loop...) 或判斷 (if...) 等用途。

3 Outline 建立及執行 Shell Script 設定與取用變數的方法 建構 Shell Script 輸出環境變數

4 建立 Shell Script 該Script會顯示目前的日期時間、執行路徑、使用者 帳號及所在的目錄位置。 #vi showinfo

5 建立 Shell Script 測試 script 時, 不要將其檔名設為 test, 因 為 test 是一個系統指令, 這可能會造成非預 期的執行結果。 此檔中開頭的 3 行以 "#" 作為註解, 在執行 時會略過。特別注意其中的第 1 行 "#!/bin/bash" 是用來指定此 script 以 bash 執 行, 如果要設定以 tcsh 執行, 則應設成 "#!/bin/tcsh"。要指定執行的 shell 時, 一定 要將它寫在第 1 行。如果沒有指定, 則以目 前正在執行的 shell 來解譯。

6 建立 Shell Script echo 指令用來顯示提示訊息, 其格式為:
其中 arg 是要顯示的訊息, 顯示多個訊息時 要以空白隔開, 如果是字串則最好以雙引號 (“) 括住, shell 才能正確的處理。

7 建立 Shell Script 參數 -neE 意義如下: -n:在顯示訊息時不自動換行 (預設會自動換行) 。
-e:顯示訊息時使用脫逸 (Escape) 字元。反斜線符 號 “\” 為脫逸字元, 用來指示其後的字串是格式 化選項。當 echo 指令使用 -e 參數輸出顯示訊息時, 會根據其後的選項將輸出訊息格式化, 而不會將 它當成一般文字輸出。以上例而言 “\n” 會使游標 在輸出後移到下一行, 而 “\c” 則使游標不會在 顯示訊息後移至下一行。 -E:顯示訊息時不使用脫逸字元。

8 建立 Shell Script 除了使用反引號外, 還可以使用 $(command) 作為指令置換, 底下兩個 用法的功用是相同的 :

9 執行 Shell Script 執行 shell script 的方式有 2 種, 一種 是執行 shell 程式, 並將該 script 當作 參數傳給它, 指令格式如下: 另一種方式是在指令列下直接輸入 script 檔名執行。以這種方式執行時, 必須先將檔案權限更改成可執行的權限, 否則在執行時系統將會回應 "Permission denied"的訊息。

10 執行 Shell Script 要設定檔案擁有者本身執行的權限, 可用下面的指令:
要設定檔案擁有者本身執行的權限, 可用下面的指令: 若要讓所有的使用者都可以執行此 shell script, 則可以執行 chmod a+x filename 指令。 其中參數 "u" 是代表設定檔案擁有者本 身的權限, 而 "+x" 則代表設定具有執 行 (eXecute) 的權限。

11 執行 Shell Script 修改剛剛建立的 showinfo 檔的權限, 並執行看看其結果為何:

12 command not found 直接執行 shell script 時, 比較常出現 的問題是找不到指令, 其錯誤訊息類 似下面這樣:

13 command not found 出現此訊息的原因多半是沒有正確設定路徑, 請執行 export PATH=$PATH:. 指令 ( 最後面 是一個冒號加一個句點 ) , 將目前的工作目 錄加入 PATH 環境變數中即可。 或在 ~/.bash_profile 檔中增加執行路徑:

14 設定與取用變數的方法 所謂變數, 就是可存放資料的識別符 號。例如 x=10, x是個變數名稱, 10 則為存放的資料。在 shell script 中設 定與取用變數的方法有底下幾種: 直接設定變數值 由指令置換取得 由指令列參數取得 由環境變數取得 由使用者輸入

15 直接設定變數值 設定變數的方法很簡單, 只要直接指 定其值即可, 例如我們可以建立一個 filename 變數存放檔名, 建立一個 user_age 變數存放使用者的年齡。 設定 5000 給 money 這個變數:

16 直接設定變數值 要取用變數值的時候, 則應於變數名稱前加 上 "$" 符號, 下例將顯示 money 的變數值:
如果想在顯示的數字前加上錢字號 "$", 則 必須使用脫逸字元:

17 由指令置換結果取得變數值 指令置換, 就是把指令執行的結果設定為某 一個變數的變數值。如先前面我們曾提到的, 反引號 (`) 及 $(command) 可用來將指令的輸 出視為字串, 因此我們可以利用此功能來設 定變數值, 底下範例設定變數 now 的值為 目前系統的時間:

18 使用指令列參數

19 使用指令列參數 執行 chmod +x showarg 指令改為可執行 當某一個參數包含空白符號時, 應將此參數以雙引 號括起來。
以下這段程式會顯示所有參數及其總數。 vi showarg 檔: 執行 chmod +x showarg 指令改為可執行

20 使用環境變數 系統中有許多內定的環境變數, 也有 許多由其他程式所輸出 (export) 的環境 變數, 這些變數也可以在 script 檔中直 接取用。 顯示所在的目錄:

21 由使用者輸入 使用 read 指令可以直接讀取使用者的輸入作為變數 值, 可以用來撰寫對話式的 shell script。
以下範例會先列出要求輸入使用者姓名的字串, 待 使用者輸入姓名後, 將輸入的字串讀入並設定為 my_name 變數的值, 使用者輸入完並按下 [Enter] 鍵後, 顯示 “My name is” 及 my_name 變數的值 (即 使用者輸入的字串):

22 由使用者輸入 修改檔案權限後即可執行, 以下為執 行結果:

23 建構 Shell Script 1 條件測試與運算式 2 程式流程控制 3 移動輸入參數 4 定義及使用函數

24 1 條件測試與運算式 test 指令用來判斷運算式的真假 (True 或 False), 其語法為:
test 指令還有另外一種表達方式, 即是 以中括號括住所要判斷的運算式, 如 "[ 運算式 ]"。使用這種表達方式時, 於運算式前不必加上 "test" 識別字。 man test

25 條件測試與運算式 在指令列執行以下範例 (等號兩邊要有一個空格):

26 條件測試與運算式 test 指令常用於 if 及 while 敘述等迴圈 結束條件的測試, 它能測試的運算式 可分成 『字串』、『數值』、『檔案』 與 『邏輯』 等 4 類。每一類的運算式 各有其適用的運算子, 以下分項列表 說明。

27 條件測試與運算式 字串運算子 數值運算子 檔案運算子 邏輯運算子

28 字串運算子 字串運算子用來判斷字串運算式的真偽。 可用的運算子如下表:

29 字串運算子 字串運算子不可使用萬用字元, 同時 應注意運算子的左右需留空白。 以下為執行範例:

30 數值運算子 數值運算子用來判斷數值運算式的真偽。 可用的運算子如下表 (其中 int1及 int2 為整 數):

31 數值運算子 如果您將數值運算子用於一般字串, 將得到錯誤訊息。以下為執行範例:

32 檔案運算子 檔案運算子用來判斷檔案是否存在, 以及檔 案形態和屬性。可用的運算子如下表:

33 檔案運算子 以下為執行範例:

34 邏輯運算子 邏輯運算子用來結合運算式或取得運算 式的相反值。可用的運算子如下表:

35 邏輯運算子 以下為執行範例:

36 2 程式流程控制 if 敘述 case 敘述 for 敘述 while 敘述及 until 敘述 break 子句及 continue 子句

37 if 敘述 if 敘述可根據運算式的真偽值, 決定要 執行的程式段落。其語法如下:

38 if 敘述 fi 是 if 敘述的結束符號 (剛好是 if 倒過 來), 必須與 if 成對出現, 而 elif 及 else子句可有可無。elif 是 else if 的簡寫, 當 if 的運算式不成立時, 才會接著測 試 elif的運算式。如果 if 及 elif 的測試 條件皆不成立, 最後才會執行 else 子 句內的指令。一個 if 可以有好幾個 elif 子句, 但只能有一個 else 子句。以下 範例將顯示目錄內是否有 readme 檔案:

39 if 敘述

40 case 敘述 case 敘述用來從許多的測試條件中選擇第 1 個符合的條件執行。其語法如下:

41 case 敘述 case 敘述適用於字串的比較, 其測試 條件可用萬用字元。雙分號 (;;) 為測試 條件的結束符號, 在每一個測試條件 成立後, 一直到雙分號之前的指令, 都會被 shell所執行。 使用萬用字元作為測試條件時, 請勿 於字串左右加上雙引號 (" "), 因為如 此將使字串無法正確匹配。

42 case 敘述 由於所有字串都可與萬用字元 * 匹配, 因此 *) 之後的指令可視為 case 敘述預 設的執行指令。
底下示範如何寫一個簡單的安裝程式, 請將檔名取為 install:

43 case 敘述

44 case 敘述

45 case 敘述 由於此為安裝程式, 故需要以 root 權 限執行, 以下為執行範例:

46 for 敘述 for 敘述可以對串列中的每一個元素執 行相同的指令。有 2 種語法:

47 for 敘述 在 shell script 中的串列是指由空白符號 所分隔的字串。

48 for 敘述 由第二種語法的定義可知它是第一種語 法的簡寫, 亦即當 for 敘述未使用 in 子句時, 即代表使用參數列作為預設 串列, 因此底下兩個敘述的功用是相 同的:

49 for 敘述 for 敘述的 in 子句與 case 敘述的 in 子 句一樣, 可使用萬用字元。
底下範例程式會顯示目錄中所有 .txt 的 文字檔案名稱及內容:

50 while 敘述及 until 敘述 while 敘述與 until 敘述的語法結構和用 途類似, while 敘述會在測試條件為真 時重複執行。語法如下:

51 while 敘述及 until 敘述 而 until 敘述會在其測試條件為假時重 複執行。其語法如下:

52 break 子句及 continue 子句 在 shell 的 for、while、until 迴圈敘述中 也可以使用如 C 語言的 break 及 continue 子句以跳脫現有的迴圈。 break 子句用於中斷迴圈的執行, 將程式 流程移至迴圈敘述結束之後的下一個指令。 continue 子句則在忽略子句之後的指令, 將程式流程移至迴圈開始的地方。

53 break 子句及 continue 子句 break 子句及 continue 子句都可加上數 字參數, 以指示要跳脫的迴圈數目, 例如以下的 continue 子句將跳脫 2 層 迴圈:

54 break 子句及 continue 子句 以下程式檔名為 jobcontrol, 用來模擬工業上的作 業流程控制:

55 break 子句及 continue 子句 修改檔案權限後, 即可於指令列輸入 bash jobcontrol 指令自行測試。

56 3 移動輸入參數 shift 指令用來將指令列參數向左移。假 設指令列的 3 個參數如下: 則在執行 shift 指令之後, 其值會變成:

57 移動輸入參數 shift 指令常與 while 敘述或 until 敘述合 用, 底下的範列示範如何將一個檔案 中的小寫英文字母全部轉為大寫字母, 筆者將其存成 upcase 檔(此 shell script 將使用 "-i" 參數指定來源檔案, 使用 "- o" 參數指定輸出後的目的檔案) :

58 移動輸入參數

59 移動輸入參數 上例中的 tr 指令會讀取第 1 個參數所 設定的檔案, 轉換字元後寫到第 2 個 參數所設的檔案。以下是執行結果:

60 移動輸入參數

61 4 定義及使用函數 當 script 檔案變得很大時, 我們可以將script 檔案中常用的指令程序寫成函數, 如此會使 script 更易於維護並更具結構性。定義函數 的語法如下:

62 定義及使用函數 函數的使用方式與外部指令一樣, 只 要直接使用函數的名稱即可。在使用函 數時, 一樣可以傳入參數。函數處理 參數的方式與 script 檔處理指令列參數 的方式是一樣的。在函數中, $1 是指 傳入函數的第 1 個參數, $2 是指傳入 函數的第 2 個參數...。同時也可以使用 shift 指令來移動函數參數。

63 定義及使用函數 底下範例示範如何將指令列輸入的數字 傳入函數中, 並顯示最大的數值。 vi maxvalue

64 定義及使用函數

65 定義及使用函數 在上例中, 為了說明如何取得函數的 傳回值而使用了 $? 及 return 指令。一 個比較常用的作法是直接取用 $maxvalue 的值, 在 scrpit 中變數值並 不會因為函數結束而消失。 範例執行結果如下:

66 4 輸出環境變數 之前的內容曾提到,可以直接將環境變 數作為 script 檔的預設變數使用。其實 也可以將 script 檔中的自訂變數輸出成 環境變數, 方法是使用 export 指令及 source 指令。 export 指令能將 script 檔內的變數輸出 給其他的指令使用, 其方法如下:

67 輸出環境變數 在一般的情況下執行 script 時, 系統會 產生一個新的 shell 程式來執行它,其 過程如下圖所示:

68 輸出環境變數

69 輸出環境變數 如上圖所示, 就算在 script 檔中有用 export 指令輸出環境變數, 也會隨著 該shell 程式的結束而消失。
要使環境變數存留於目前的 shell 中, 則必須使用 source 指令執行該 script。 其語法如下:

70 輸出環境變數 以 source 指令執行 script 程式時, 系 統並不會產生新的 shell 程式, 而是以 目前的 shell 環境來執行:

71 輸出環境變數

72 輸出環境變數 由此可見, 以 source 指令執行 script 程式,可使該檔中所 export 的變數存 留在 shell 中,而成為環境變數。 此外, 在 bash 中可以使用 . 指令來取 代 source 指令, 以下兩個指令的功能 相同:


Download ppt "Shell Script 程式設計."

Similar presentations


Ads by Google