文章大綱 一、關於shell二、shell進階(重點)三、學習資料下載四、參考文章 一、關於shell 1. 什麼是shell 1.1 shell簡介 Shell(外殼) 是一個用 C 語言編寫的程式,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程式設計語言。 Shell ...
文章大綱
一、關於shell
二、shell進階(重點)
三、學習資料下載
四、參考文章

一、關於shell
1. 什麼是shell
1.1 shell簡介
Shell(外殼) 是一個用 C 語言編寫的程式,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程式設計語言。
Shell 是指一種應用程式,這個應用程式提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。
1.2 什麼是腳本?
腳本簡單地說就是一條條的文字命令,這些文字命令是可以看到的(如可以用記事本打開查看、編輯)。
常見的腳本: JavaScript(JS,前端),VBScript, ASP,JSP,PHP(後端),SQL(資料庫操作語言),Perl,Shell,python,Ruby,JavaFX,Lua等。
1.3 為什麼要學習和使用shell?
Shell屬於內置的腳本
程式開發的效率非常高,依賴於功能強大的命令可以迅速地完成開發任務(批處理)
語法簡單,代碼寫起來比較輕鬆,簡單易學
1.4 常見的shell種類?
在linux中有很多類型的shell,不同的shell具備不同的功能,shell還決定了腳本中函數的語法,Linux中預設的shell是/bin/bash(重點),流行的shell有ash、bash、ksh、csh、zsh等,不同的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腳本都會指定它為執行路徑。
2. shell入門
編寫規範:
代碼規範:
#!/bin/bash [指定告知系統當前這個腳本要使用的shell解釋器]
Shell相關指令
文件命名規範:
文件名.sh .sh是linux下bash shell 的預設尾碼
使用流程:
①創建.sh文件 touch/vim
②編寫shell代碼
③執行shell腳本 腳本必須得有執行許可權
案例1:創建test.sh,實現第一個shell腳本程式,輸出hello world.
輸出命令:#echo 123
註意:輸出的內容如果包含字母和符號(不包含變數),則需要用引號包括起來。如果是純數字可以包也可以不包。


註意,這裡在運行時一定要寫成 ./test.sh,而不是 test.sh,運行其它二進位的程式也一樣,直接寫 test.sh,Linux 系統會去 PATH(環境變數) 里尋找有沒有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的當前目錄通常不在 PATH 里,所以寫成 test.sh 是會找不到命令的,要用 ./test.sh 告訴系統說,就在當前目錄找。
案例2:使用root用戶帳號創建並執行test2.sh,實現創建一個shelltest用戶,併在其家目錄中新建文件try.html。

腳本執行的另外一個方式:/bin/bash 腳本的路徑(瞭解)

Shell腳本分為簡單的寫法(簡單命令的堆積)和複雜寫法(程式的設計)
二、shell進階(重點)
1. 變數(重點)
1.1 變數的含義
a. 什麼是量
量就是數據.
b. 什麼是變數
數據可以發生改變就是變數.
在一個腳本周期內,其值可以發生改變的量就是變數.
c. 什麼叫做一個腳本周期
一個腳本周期我們可以簡單的理解為當前的shell文件
變數是shell中不可或缺的一部分,也是最基礎、最重要的組成部分。
1.2 變數的定義與使用(重點)
變數,先定義後使用。
定義形如:class_name="yunwe "
使用形如:echo $class_name
變數就是由2部分組成,一個是變數名(左邊),另外一部分是變數的值(右邊)
變數名和變數值是什麼關係??
變數名和變數值是使用和被使用關係; 我們的變數名來使用變數值;
在使用變數的時候一定需要在變數名前面添加一個$符號,該要求在其他語言中也存在的(例如php)。
變數名的規範
註意,變數名後面的等號左右不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變數名的命名須遵循如下規則:
命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭。
中間不能有空格,可以使用下劃線“_”。
不能使用標點符號。
不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。
案例1:使用變數改寫入門腳本中的第1個shell腳本。


關於單雙引號的問題:
雙引號能夠識別變數,雙引號能夠實現轉義(類似於“*”)
單引號是不能識別變數,只會原樣輸出,單引號是不能轉義的
案例2:定義一個變數,輸出當前時間,要求格式為“年-月-日 時:分:秒”。

註意:反引號(esc鍵下方的那個鍵),當在腳本中需要執行一些指令並且將執行的結果賦給變數的時候需要使用“反引號”。

1.3 只讀變數(瞭解)
語法:readonly 變數名
案例:定義變數a並且其值為10,隨後設置其為只讀變數,再去嘗試重新賦值


1.4 接收用戶輸入(重點)
語法:read -p 提示信息 變數名
案例:編寫一個腳本test6.sh,要求執行之後提示用戶輸入文件的名稱(路徑),然後自動為用戶創建該文件


1.5 刪除變數(瞭解)
語法:unset 變數名
案例:定義變數b=20,再輸出b的值,隨後刪除b,最後再輸出下b


2. 條件判斷語句
老婆給當程式員的老公打電話:下班順路買一斤包子帶回來,如果看到賣西瓜的,買一個。當晚,程式員老公手捧一個包子進了家門…老婆怒道:你怎麼就買了一個包子?!老公答曰:因為看到了賣西瓜的。
把程式員老婆的話當作一段需求分析一下吧。買一斤包子是一個確定無疑的需求項,無論後面是什麼情況什麼條件,前面這一斤包子是肯定要買的。看到賣西瓜的是一個條件判斷,後面“買一個”是一個模糊不清的需求項,買一個什麼呢?需求里沒說啊。客戶把這個當作開發人員預設瞭解的內容了。可是作為一個成熟合格的程式員,該老婆的丈夫應該馬上跟進確認需求“買一個什麼?”,要不然程式可怎麼寫呢?所以笑話里該程式員是不合格的,起碼是不積極不負責的。在沒有明確需求的情況下,他只能按照自己的理解來完成工作了。那比較可能的結果就有如下幾種:
(1)看到賣西瓜的,買一個西瓜
如果 看到賣西瓜的
那麼
買一個西瓜
否則
買一斤包子
(2)看到賣西瓜的,買一個包子
如果 看到賣西瓜的
那麼
買一個包子
(3)看到賣西瓜的,買一個賣西瓜的
(4)看到賣西瓜的,買一個老婆一直想買的東西
(5)看到賣西瓜的,隨便買一個東西
上述1和2下麵的條件漢字描述稱之為“偽代碼”,也是屬於條件表達式的語法。
語法1(一個條件):
if condition
then
command1
command2
fi
單行寫法(一般在命令行中執行的時候):if [ condition ]; then command; fi
語法2(兩個條件):
if condition
then
command1
command2
...
else
command
fi
語法3(多個條件):
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
3. 運算符
在shell中,運算符和其他編程腳本語言一樣,常見的有算數運算符、關係運算符、邏輯運算符、字元串運算符、文件測試運算符等
3.1 算數運算符
下表列出了常用的算術運算符,假定變數 a 為 10,變數 b 為 20:

原生bash不支持簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。
expr 是一款表達式計算工具,使用它能完成表達式的求值操作。
例如,兩個數相加(註意使用的是反引號 ` 而不是單引號 '):
#!/bin/bash
val=`expr 2 + 2`
echo "兩數之和為 : $val"
兩點註意:
表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數編程語言不一樣。
完整的表達式要被 包含,註意這個字元不是常用的單引號,在 Esc 鍵下邊。


3.2 關係運算符
關係運算符只支持數字,不支持字元串,除非字元串的值是數字。
下表列出了常用的關係運算符,假定變數 a 為 10,變數 b 為 20:

-eq:equal
-ne:not equal
-gt:great than
-lt:less than
-ge:great than or equal
-le:less than or equal
案例:使用a=10,b=20來實現本案例


課堂作業:
寫一個腳本,判斷當前輸入的用戶是否存在。如果存在則提示“用戶存在”否則提示“用戶不存在”。

3.3 邏輯運算符
下表列出了常用的布爾運算符,假定變數 a 為 10,變數 b 為 20:

或運算:一個為真即為真,全部為假才是假
與運算:一個為假即為假,全部為真才是真

3.4 字元串運算符
下表列出了常用的字元串運算符,假定變數 a 為 "abc",變數 b 為 "efg":


案例:將上述的語法驗證下

3.5 文件測試運算符(重點)
文件測試運算符用於檢測 Unix/Linux 文件的各種屬性。
屬性檢測描述如下:


案例:測試上述標綠色的效果

註意:許可權幾個判斷,如果只有一個部分符合,則認為是有許可權的。
4. shell腳本附帶選項(重點)
問題描述:在linux shell中如何處理tail -10 access.log這樣的命令行選項?
步驟:
調用tail指令
系統把後續選項傳遞給tail
Tail先去打開指定的文件
取出最後10行
問題:自己寫的shell是否也可以像內置命令一樣傳遞一些選項呢?
答:可以的,傳遞方式與上述的描述是一樣的,關鍵是怎麼接收。例如:
傳遞:
#./test.sh a b c
接收:
在腳本中可以用“2”來表示b,以此類推。
接收可以用“$”加上選項對應的序號即可。
測試:編寫test14.sh,傳遞a,b,c,輸出其值

其實2是變數。
練習:創建自定義指令“user”,可以直接執行,要求該指令具備以下語法和功能:
a. #user -add 用戶名 【添加用戶】
b. #user -del 用戶名 【刪除用戶及其家目錄】

同時題目中要求是指令,所以可以再去添加個別名:

三、學習資料下載
鏈接:https://pan.baidu.com/s/1c0Oc2sopafpW9CwK1kfauA
提取碼:tla4
四、參考文章
https://blog.csdn.net/w1416520110/article/details/79987578