shell程式設計
一、簡介
1、概念
shell就是一個計算機應用程式,跟QQ、微信等類似,但是他主要是提供計算機的操作介面,例如我們所使用Windows作業系統的圖形操作介面和cmd.exe命令列操作介面。 shell並不是作業系統核心,可以看成是核心外邊的殼,可以實現人機友好互動。
shell同時也可以看成是一種命令語言,本身是用C語言編寫的,用shell命令可以編寫程式,即我們所說的指令碼程式(shell script),所以shell與shell script並不是同一個概念,但通常說shell指令碼時就直接說成shell了。在本節所說的shell程式設計其實就是用shell命令語言編寫的shell script。
2、分類
主要分為圖形介面shell和命令列式shell兩類
圖形介面:Graphical User Interface shell 即 GUI shell,應用最常見,例如個人windows系統大部分都是GUI shell
命令列式:Command Line Interface shell ,即CLI shell,個人應用較少,主要是在伺服器領域,例如伺服器領域的linux作業系統大部分都是CLI shell
3、發展歷史
二、程式設計風格
1、程式設計正規化
面向物件:以資料為中心,考慮先如何組織資料,指令服務於資料。
面向過程:以指令為中心,來進行寫程式,資料服務於指令。
2、程式語言
低階:組合語言
高階:需要進行編譯解釋的語言
編譯:高階語言-->編譯器-->目的碼
解釋:高階語言-->直譯器-->機器程式碼
可以看出shell指令碼語言是高階語言,需要直譯器解釋後才能執行
程式執行方式:程式最終都是要轉成機器程式碼才能在計算機上執行,機器程式碼就是二進位制指令
3、執行模式
順序執行
迴圈執行 for while until
選擇執行 if elsif case
三、程式設計結構
1、程式形式
整個程式最終就以文字檔案的形式存在,就是所說的一個指令碼檔案。
2、程式組成
一般在指令碼頂行新增直譯器路徑#!/bin/bash
變數、陣列等基本元素
構成一個表示式
多個表示式構成一個語句
多個語句構成整個指令碼檔案
結構的核心就是呼叫指令(堆命令,嚴重依賴當前環境)
四、應用場景
重複 批量事務處理 自動化運維 定期任務執行 (crontab) 伺服器執行監控
五、程式執行
1、python程式的執行
shell指令碼的執行類似於python指令碼的執行,我們先來看python檔案的執行過程,python指令碼的執行分為兩類,每一類都有絕對路徑與相對路徑兩種執行方式。
1、互動式shell環境下直接執行
2、使用直譯器執行
2、shell程式執行
1、在互動式shell環境直接執行
2、使用直譯器執行
3、前面加點執行
4、使用source執行
5、bash的單步執行
六、shell變數
1、概念
變數:是一段記憶體空間的引用
賦值:變數名=值
注意>> 變數在賦值是不能再前面帶$
2、命名規則
變數名只能包含字母、數字和下劃線,並且不能以數字開頭
變數名區分大小寫
儘量能見名知義
變數不能以數字開頭
3、變數分類
區域性變數:變數僅對當前Shell程序有效
定義變數:Var_Name="Value"
環境變數:對當前shell程序及其子shell程序有效(但不可跨終端)
定義變數:export Var_Name=”Value”
或 Var_Name="Value" export Var_Name
環境變數對於當前shell和子shell都有效
檢視系統內建環境變數env
4、引用變數
${Var_Name}:引用變數
通常情況下大括號可以省略,可以簡寫成:$Var_Name
echo $Var_Name :列印變數的值
5、撤銷變數unset Var_Name
6、變數替換
通常情況下大括號可以省略 如果變數名後面要跟如下內容:字串(包括大小字串)、數字或下劃線,那麼變數名就一定要用大括號包起來
7、命令替換
1、$(命令1;命令2......) (有些shell不相容,tsh)
2、倒引號 ``,`命令1;命令2......` (相容性好,但是可讀性差)
括號或倒引號內命令的執行結果(標準輸出)返回給當前shell,相當於產生了一個新的命令,其標準輸出可被echo或者被當前shell的命令所使用
8、變數在單雙引號中的引用
‘’ 單引號: 強引用,變數替換不會進行,變數名不會被替換成變數對應的值
"" 雙引號:弱引用,能夠執行變數替換,變數名可以被替換成變數對應的值
9、位置變數
變數形式:$1, $2, $3, ......, $n ($9以後需要用${10})
作用:用來接收給shell指令碼所傳遞的引數,第一個引數用$1來獲取,第二個引數用$2來獲取,......
例1:隨機在系統內找兩個文字檔案,分別輸出它們空行的數量
10、特殊變數
$0 : 指令碼名稱自身
$? :上一條命令的執行狀態
狀態用數字表示:0-255
0:表示成功
1-255:失敗,1.2.127.255預留
$#: 記錄位置引數個數的總和
$*: 詳細列出所有的位置引數
$$: 當前所在程序的程序號
七、算術運算
1、declare
2、expr
3、let
4、$[算數表示式]
5、$((算術表示式))
7、算數運算子
單個運算子:+,- ,*,/,%(餘數)
組合運算子:+= ,-=,*=,/=,%=
a+=b -----> a=a+b
a-=b ------> a=a-b
a*=b --------> a=a*b
a /=b ---------> a=a/b
變數++:a++ ----> a=a+1
變數--:a-- ------> a=a-1
注意 :除法只能使用整數部分
例2:隨機選擇兩個文字,計算出兩個文字生效的行數
八、互動式輸入、輸出
輸入:read [-p "提示資訊"] 變數名
輸出:echo $變數名
九、條件判斷
1、比較運算子
檔案操作符
-d:測試是否為目錄(Directory)
-e:測試目錄或檔案是否存在(Exist)
-f:測試是否為檔案(File)
-r:測試當前使用者是否有許可權讀取(Read)
-w:測試當前使用者是否有許可權寫入(Write)
-x:測試當前使用者是否可執行(Excute)該檔案
-L:測試是否為符號連線(Link)檔案
可以使用echo $?來判斷,0為真,非0為假
數字操作符
-eq -gt -ge -lt -le -ne
等於 大於 大於等於 小於 小於等於 不等於
-eq = equals to =
-gt = great than >
-ge = great or equals to >=
-lt = less than <
-le = less or equals to <=
-ne = not equals to !=,<>
字串操作符
= :字串內容相同
!= :字串內容不同,! 號表示相反的意思
-z :字串內容為空
2、邏輯運算子
與: &&
或:||
非:!
0:真
1:假
&& | 1 | 0 |
1 | 1 | 1 |
0 | 1 | 0 |
|| | ||
1 | 1 | 0 |
0 | 0 | 0 |
! | 0 | 1 |
3、判斷方法
test 條件表示式
[ 操作符 檔案或目錄 ]或者[[ 操作符 檔案或目錄 ]](中括號與表示式之間一定要有空格)
十、迴圈結構
1、for迴圈
格式:
for var_Name in 列表; do
迴圈體(正常執行的執行命令)
語句1......
done
seq命令:類似於python裡的range函式
例3:生成5個空檔案,檔名從1到10,字尾”.txt”
例4:新增user1到5使用者,每新增一個顯示/etc/passwd的最後一行資訊
例5:再把例4建立的5個新使用者和例3建立的5個空檔案刪除
例6:求從1加到100的結果
2、while迴圈
格式:
while [條件]; do
迴圈體(正常執行的執行命令)
語句1......
done
退出迴圈:
break:結束並退出迴圈
continue:在迴圈中不執行continue下面的程式碼,轉而進入下一輪迴圈
退出指令碼:
exit:常帶一個整數給系統,如 exit 0
例7:計算所有引數的和
3、until迴圈
條件測試不成功即進入迴圈體
格式:
until [條件]; do
迴圈體(正常執行的執行命令)
語句1......
done
例8:求1到100所有整數的和
十一、選擇結構
1、if條件判斷
單分支:
if condition; then
statement1
......
fi
例9:變數Name是zhangsan,列印歡迎你
雙分支 :
if condition; then
statement1
else
statement2
fi
例10:變數Name是zhangsan,列印歡迎你,否則列印不歡迎
多分支:
if condition; then
statement1
elif condition; then
statement2
...
else
statementn
fi
例11:變數score小於60,列印不及格;60到80之間,列印及格;80到100之間,列印優秀;否則列印分數有誤
例12:建立使用者,如果建立成功,列印成功;如果失敗,列印已存在
例13:for迴圈列印9*9乘法表
2、case語句
格式 :
case 變數引用 in
正則表示式1)
分支1
;;
正則表示式2)
分支2
;;
正則表示式n)
分支n
;;
*)
預設分支
;;
esac
例14:變數score 在1和9之間太低了,score小於60,列印不及格;60到80之間,列印及格;80到100之間,列印優秀;否則列印分數有誤
十二、函式
格式:
function 函式名() {
命令序列
......
return xxx
}
呼叫 :函式名 [ 引數1 ] [ 引數2 ] .....
例15:列印引數