一、關于shell
1、什麼是shell
2、shell入門
二、shell進階(重點)
1、變量(重點)
1.1、變量的含義
1.2、變量的定義與使用(重點)
1.3、隻讀變量(了解)
1.4、接收使用者輸入(重點)
1.5、删除變量(了解)
2、條件判斷語句
3、運算符
3.1、算數運算符
3.2、關系運算符
3.3、邏輯運算符
3.4、字元串運算符
3.5、檔案測試運算符(重點)
4、shell腳本附帶選項(重點)
什麼是shell?
<code>Shell</code>(外殼) 是一個用 <code>C</code> 語言編寫的程式,它是使用者使用 Linux 的橋梁。<code>Shell</code> 既是一種指令語言,又是一種程式設計語言。
<code>Shell</code> 是指一種應用程式,這個應用程式提供了一個界面,使用者通過這個界面通路作業系統核心的服務。
什麼是腳本?
腳本簡單地說就是一條條的文字指令,這些文字指令是可以看到的(如可以用記事本打開檢視、編輯)。
常見的腳本: <code>JavaScript(JS,前端),VBScript, ASP,JSP,PHP(後端),SQL(資料庫操作語言),Perl,Shell,python,Ruby,JavaFX,Lua</code>等。
為什麼要學習和使用shell?
Shell屬于内置的腳本
程式開發的效率非常高,依賴于功能強大的指令可以迅速地完成開發任務(批處理)
文法簡單,代碼寫起來比較輕松,簡單易學
常見的shell種類?
在linux中有很多類型的shell,不同的shell具備不同的功能,shell還決定了腳本中函數的文法,Linux中預設的shell是/bin/bash(重點),流行的shell有<code>ash、bash、ksh、csh、zsh</code>等,不同的shell都有自己的特點以及用途。
csh
C shell 使用的是“類C”文法,csh是具有C語言風格的一種shell,其内部指令有52個,較為龐大。目前使用的并不多,已經被/bin/tcsh所取代。
ksh
Korn shell 的文法與 Bourne shell 相同,同時具備了 C shell 的易用特點。許多安裝腳本都使用 ksh ,ksh有42條内部指令,與bash相比有一定的限制性。
tcsh
tcsh是csh的增強版,與 C shell 完全相容。
sh
是一個快捷方式,已經被/bin/bash所取代。
nologin
指使用者不能登入

zsh
目前Linux裡最龐大的一種shell:zsh。它有84個内部指令,使用起來也比較複雜。一般情況下,不會使用該shell。
bash
大多數Linux系統預設使用的shell,bash shell 是 Bourne shell 的一個免費版本,它是最早的 Unix shell,bash還有一個特點,可以通過help指令來檢視幫助。包含的功能幾乎可以涵蓋shell所具有的功能,是以一般的shell腳本都會指定它為執行路徑。
編寫規範:
代碼規範:
檔案命名規範:
使用流程:
①建立.sh檔案 <code>touch/vim</code>
②編寫shell代碼
③執行shell腳本 腳本必須得有執行權限
案例1:建立<code>test.sh</code>,實作第一個shell腳本程式,輸出<code>hello world.</code>
輸出指令:<code># echo 123</code>
注意:輸出的内容如果包含字母和符号(不包含變量),則需要用引号包括起來。如果是純數字可以包也可以不包。
注意:這裡在運作時一定要寫成 <code>./test.sh</code>,而不是 <code>test.sh</code>,運作其它二進制的程式也一樣,直接寫 <code>test.sh</code>,Linux 系統會去 <code>PATH</code>(環境變量) 裡尋找有沒有叫 <code>test.sh</code> 的,而隻有 <code>/bin</code>, <code>/sbin</code>, <code>/usr/bin</code>,<code>/usr/sbin</code> 等在 <code>PATH</code> 裡,你的目前目錄通常不在 <code>PATH</code> 裡,是以寫成 <code>test.sh</code> 是會找不到指令的,要用 <code>./test.sh</code> 告訴系統說,就在目前目錄找。
案例2:使用<code>root</code>使用者帳号建立并執行<code>test2.sh</code>,實作建立一個<code>shelltest</code>使用者,并在其家目錄中建立檔案<code>try.html</code>。
腳本執行的另外一個方式:<code>/bin/bash 腳本的路徑</code>(了解)
Shell腳本分為簡單的寫法(簡單指令的堆積)和複雜寫法(程式的設計)
a. 什麼是量
量就是資料.
b. 什麼是變量
資料可以發生改變就是變量.
在一個腳本周期内,其值可以發生改變的量就是變量.
c. 什麼叫做一個腳本周期
一個腳本周期我們可以簡單的了解為目前的<code>shell</code>檔案
變量是<code>shell</code>中不可或缺的一部分,也是最基礎、最重要的組成部分。
變量,先定義後使用。
定義形如:<code>class_name="yunwe "</code>
使用形如:<code>echo $class_name</code>
變量就是由2部分組成,一個是變量名(左邊),另外一部分是變量的值(右邊)
變量名和變量值是什麼關系?
變量名和變量值是使用和被使用關系; 我們的變量名來使用變量值;
在使用變量的時候一定需要在變量名前面添加一個<code>$</code>符号,該要求在其他語言中也存在的(例如php)。
變量名的規範
注意,變量名後面的等号左右不能有空格,這可能和你熟悉的所有程式設計語言都不一樣。同時,變量名的命名須遵循如下規則:
命名隻能使用英文字母,數字和下劃線,首個字元不能以數字開頭。
中間不能有空格,可以使用下劃線“_”。
不能使用标點符号。
不能使用<code>bash</code>裡的關鍵字(可用<code>help</code>指令檢視保留關鍵字)。
案例1:使用變量改寫入門腳本中的第1個shell腳本。
關于單雙引号的問題:
雙引号能夠識别變量,雙引号能夠實作轉義(類似于“<code>\</code>”)
單引号是不能識别變量,隻會原樣輸出,單引号是不能轉義的
案例2:定義一個變量,輸出目前時間,要求格式為“年-月-日 時:分:秒”。
注意:反引号(<code>esc</code>鍵下方的那個鍵),當在腳本中需要執行一些指令并且将執行的結果賦給變量的時候需要使用“<code>反引号</code>”。
文法:<code>readonly 變量名</code>
案例:定義變量a并且其值為10,随後設定其為隻讀變量,再去嘗試重新指派
文法:<code>read -p 提示資訊 變量名</code>
案例:編寫一個腳本<code>test6.sh</code>,要求執行之後提示使用者輸入檔案的名稱(路徑),然後自動為使用者建立該檔案
文法:<code>unset 變量名</code>
案例:定義變量<code>b=20</code>,再輸出b的值,随後删除b,最後再輸出下b
文法1(一個條件):
單行寫法(一般在指令行中執行的時候):<code>if [ condition ]; then command; fi</code>
文法2(兩個條件):
文法3(多個條件):
在shell中,運算符和其他程式設計腳本語言一樣,常見的有算數運算符、關系運算符、
邏輯運算符、字元串運算符、檔案測試運算符等
下表列出了常用的算術運算符,假定變量 a 為 10,變量 b 為 20:
注意:條件表達式要放在方括号之間,并且要有空格,例如: <code>[$a==$b]</code> 是錯誤的,必須寫成
<code>[ $a == $b ]</code>。
原生<code>bash</code>不支援簡單的數學運算,但是可以通過其他指令來實作,例如 <code>awk</code> 和 <code>expr,expr</code>
最常用。
<code>expr</code> 是一款表達式計算工具,使用它能完成表達式的求值操作。
例如,兩個數相加 ( 注意使用的是反引号 ):
兩點注意:
表達式和運算符之間要有空格,例如 <code>2+2</code> 是不對的,必須寫成 <code>2 + 2</code>,這與我們熟悉的大多數程式設計語言不一樣。
完整的表達式要被 反引号 包含,注意這個字元不是常用的單引号,在 <code>Esc</code> 鍵下邊。
關系運算符隻支援數字,不支援字元串,除非字元串的值是數字。
下表列出了常用的關系運算符,假定變量 a 為 10,變量 b 為 20:
案例:使用a=10,b=20來實作本案例
練習:
寫一個腳本,判斷目前輸入的使用者是否存在。如果存在則提示“使用者存在”否則提示“使用者不存在”。
下表列出了常用的布爾運算符,假定變量 a 為 10,變量 b 為 20:
或運算:一個為真即為真,全部為假才是假
與運算:一個為假即為假,全部為真才是真
下表列出了常用的字元串運算符,假定變量 a 為 “abc”,變量 b 為 “efg”:
案例:将上述的文法驗證下
檔案測試運算符用于檢測 Unix/Linux 檔案的各種屬性。
屬性檢測描述如下:
案例:測試上述标綠色的效果
注意:權限幾個判斷,如果隻有一個部分符合,則認為是有權限的。
問題描述:在linux shell中如何處理tail -10 access.log這樣的指令行選項?
步驟:
問題:自己寫的<code>shell</code>是否也可以像内置指令一樣傳遞一些選項呢?
答:可以的,傳遞方式與上述的描述是一樣的,關鍵是怎麼接收。例如:
傳遞:
接收:
在腳本中可以用“$1”來表示a,“$2”來表示b,以此類推。
接收可以用“$”加上選項對應的序号即可。
測試:編寫<code>test14.sh</code>,傳遞a,b,c,輸出其值
其實$1、$2是變量。
練習:建立自定義指令“user”,可以直接執行,要求該指令具備以下文法和功能:
同時題目中要求是指令,是以可以再去添加個别名: