1. 程式人生 > >shell 指令碼程式設計

shell 指令碼程式設計

編譯器、直譯器

程式語言分為:機器語言(010101 程式碼)、組合語言、高階語言(比較接近於人類的思考方 式,也接近於機器的執行特性,需要編譯器或者直譯器轉換成機器語言) 

高階語言基本可以分為兩類:

靜態語言:編譯型語言,一般都是強型別的語言

                  需要實現編譯,實現轉換成可執行格式

                  屬於靜態語言的:C,C++,Java,C#等

動態語言:解釋型語言,一般都是弱型別的語言

                 邊解釋邊執行(如:直譯器解釋一條語句執行一條語句)

                 如:ASP,PHP,shell,python,perl等等

shell為解釋型語言,也就是說執行bash的指令碼時,系統中要有bash的直譯器,直譯器本身通常都是由靜態語言開發的。

 

面向過程:著眼點在問題解決過程的本身動作,shell指令碼,C語言都是面向過程的

面向物件:將問題抽象為一個物件,Java,python為純面向物件的

 

要想理解程式設計,就必須得理解變數,變數就是記憶體空間

變數:指向一段記憶體空間,對記憶體空間得一個命名

記憶體為編址得儲存單元,都有唯一得地址指向某個儲存單元

如儲存一個字串的“10”和一個整數“10”的區別:

字串“10”:需要 16bit 儲存空間 整數 10:需要 8bit (8 位二進位制儲存的範圍 0-255 ,2^8)

所以變數需要有型別:

變數型別:實現確定資料的儲存格式和儲存長度,如字元,整數。。。。。。

字元:

數值:

        整型

        浮點型

        Bool 型:真、假 

指令碼語言,有直譯器得語言,變數都是弱型別得,都有直譯器提供保護機制,來規範變數型別。

運算除了算術運算,還有邏輯運算:

邏輯運算:與,或,非,異或

異或:兩個運算元相同為假,否則為真

Shell:弱型別程式語言

強型別語言:變數在使用前,必須事先宣告,甚至還需要初始化

弱型別語言:變數用時宣告,就是拿來直接使用即可,不區分型別 
 
變數賦值:VAR_NAME=VALUE 

對於bash shell變數型別:

環境變數:作用域為當前shell程序及其子程序(子shell)

       定義環境變數:export  VARNAME=VALUE(也稱為匯出一個變數)

環境變數例子:

此時,如果重新登陸一個shell,則讀取不到,因為重新登陸shell與當前shell已經沒有任何聯絡了。

 指令碼在執行時會啟動一個子shell程序:

         命令列啟動得指令碼會繼承當前得shell環境:

         系統自動執行得指令碼(非命令列啟動),需要定義需要得各環境變數:(如:crontab中的指令碼經常出現某種問題)

 本地變數:宣告本地變數 VARNAME=VALUE,作用範圍為整個指令碼

 區域性變數:針對函式而言,宣告區域性變數:local   VARNAME=VALUE,作用範圍為當前的程式碼段

 

位置變數:$1,$2,......用來引用指令碼的引數的

特殊變數:bash內建的,用來儲存某些特殊資料的變數

                  $?:上一個命令執行狀態返回值

                   程式執行,可能有兩類返回值:

                           程式執行結果 

                            程式狀態返回程式碼(0-255)

                             0:正確執行

                             1-255: 錯誤執行,1,2,127 為系統預留 

                           

                           

引用變數:${VARNAME},{}可以省略,在父shell宣告的變數不能被子shell使用

必須得使用{}的情況:

有時候在命令輸入執行後,程式執行結果不需要,只要狀態返回碼,這時需要將程式執行結果重定向

輸出重定向:

>:覆蓋重定向

>>:追加重定向

2>:錯誤重定向 2

>>:錯誤之家重定向

&>:同時重定向

一個經常用到的重定向特殊位置:/dev/null

撤銷變數:

    定義變數的時候使用set,一般情況下都省略了。Unset撤銷變數

    unset  VARNAME 

    注:變數名不加$,export 的時候變數名也不加$

    

檢視當前 shell 中的變數:包括環境變數和本地變數

檢視當前 shell 的環境變數:

Printenv

Env

Export

變數的追加:

為 PATH 環境變數補上一個新的執行路徑:

對於shell來講,所有的變數預設都是字串,所以預設情況下是不能做算術運算的

 

 

指令碼:通常情況下為命令的堆砌,按照實際需要結合命令流程控制機制實現源程式

(file 檢視是否為可執行程式,ELF為linux核心可以直接執行的程式)

Shebang:制定程式的模數

練習: 1、新增 5 個使用者,user1,user2...user5 2、每個使用者的密碼同用戶名,而且要求,新增密碼完成後不顯示命令執行的結果資訊 3、每個使用者新增完成後都要顯示”使用者 xxx 已經成功新增“;若使用者此前已經存在則也要提 示出來,並且不執行新增動作
 
練習:寫一個指令碼,完成以下任務: 1、使用一個變數儲存一個使用者名稱 2、刪除此變數中的使用者且一併刪除其家目錄 3、顯示”使用者刪除完成“類的提示資訊
 
從根本上講,上邊的兩個聯絡不能稱為指令碼,只是命令的簡單堆砌

條件判斷:

Bash 如何實現條件判斷:

條件測試型別:

      整數測試:2是否等於3

      字串測試:變數中的字串是否為“abcd”

      檔案測試:檔案是否存在

條件測試的表示式,常用的三種

      [expression]

      [[expression]](兩個中括號是bash的關鍵字)

      test   expression

整數比較:

-eq:測試兩個整數是否相等:$A -eq $B

-

-ne:測試兩個整數是否不相等;$A -ne $B,不相等為真,相等為假

-gt:測試一個數是否大於另外一個數;$A  -gt $B

-lt:測試一個數是否小於另一個數

le:小於或者等於

Bash shell 中命令的邏輯關係:

邏輯與:&& 第一個條件為假時,第二個條件不會再判斷,最終結果已經確定。若第一個條件為真,則第二個條件必須再判斷,最後才會確定最終的判斷。

邏輯或:||   如果第一個條件為假,那麼就執行第二個條件的命令

變數名:

  1.只能包含字母,數字和下劃線,並且不能數字開頭

  2.不應該跟系統中已有的環境變數重名

  3.最好做到見名義