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.最好做到見名義