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、變量替換
通常情況下大括號可以省略 如果變量名後面要跟如下內容:字符串(包括大小字符串)、數字或下劃線,那麼變量名就一定要用大括號包起來
![](http://i2.51cto.com/images/blog/201809/16/cfd11105023ac11c2157947fd03ab674.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
7、命令替換
1、$(命令1;命令2......) (有些shell不兼容,tsh)
2、倒引號 `,
命令1;命令2......` (兼容性好,但是可讀性差)
括號或倒引號內命令的執行結果(標準輸出)返回給當前shell,相當於產生了一個新的命令,其標準輸出可被echo或者被當前shell的命令所使用
8、變量在單雙引號中的引用
‘’ 單引號: 強引用,變量替換不會進行,變量名不會被替換成變量對應的值
"" 雙引號:弱引用,能夠執行變量替換,變量名可以被替換成變量對應的值
9、位置變量
變量形式:$1, $2, $3, ......, $n ($9以後需要用${10})
作用:用來接收給shell腳本所傳遞的參數,第一個參數用$1來獲取,第二個參數用$2來獲取,......
例1:隨機在系統內找兩個文本文件,分別輸出它們空行的數量
![](http://i2.51cto.com/images/blog/201809/16/2fab90dc28aa74a9919a1407aedb2a76.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
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=ab
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:假
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:打印參數