Linux虛擬機(CentOS5)學習筆記(八)之Shell基礎

十一. Shell基礎

一、關於shell

1、什麼是shell?

Shell(外殼)是一個用c語言編寫程序,它是用戶使用Linux的橋樑。Shell既是一種命令語言,又是一種程序設計語言。
Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。什麼是腳本?
腳本簡單地說就是一條條的文字命令,這些文字命令是可以看到的(如可以用記事本打開查看、編輯)。
常見的腳本:JavaScript(JS,前端),VBScript,ASP,JSP,PHP(後端),SQL(數據庫操作語言),Perl,Shell,python,Ruby,JavaFX,Lua等。
爲什麼要學習和使用shell?

Shell 屬於內置的腳本

程序開發的效率非常高,依賴於功能強大的命令可以迅速地完成開發任務(批處理)

常見的shell種類?
在linux中有很多類型的shell,不同的shell具備不同的功能,shell還決定了腳本中函數的語法,Linux中默認的shell是**/bin/bash**(重點),流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特點以及用途。
csh cshell 使用的是“類C”語法csh是具有c語言風格的一種shell,其內部命令有52個,較爲龐大。目前使用的並不多,已經被/bin/tcsh所取代。
ksh Korn shell的語法與Bourne shell相同,同時具備了Cshell的易用特點。許多安裝腳本都使用ksh,ksh有42條內部命令,與bash相比有一定的限制性。
tcsh tcsh是csh的增強版,與Cshell 完全兼容。

sh是一個快捷方式,已經被/bin/bash所取代。
nologin指用戶不能登錄

zsh目前Linux 最龐大的一種shell:zsh。它有84個內部命令,使用起來也比較複雜。一般情況下,不會使用該shell。
bash大多數Linux系統默認使用的shell,bash shell 是Bourne shell的一個免費版本,它是最早的Unixshell,bash還有一個特點,可以通過help命令來查看幫助。包含的功能幾乎可以涵蓋shell所具有的功能,所以一般的shel腳本都會指定它爲執行路徑。

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="yunwei"
使用形如:echo $class name

變量就是由2部分組成,一個是變量名(左邊),另外一部分是變量的值(右邊)變量名和變量值是什麼關係??
變量名和變量值是使用和被使用關係;我們的變量名來使用變量值;

在使用變量的時候一定需要在變量名前面添加一個s符號,該要求在其他語言中也存在的(例如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:

注意:條件表達式要放在方括號之間,並且要有空格,例如:`[$a==$b]`是錯誤的,必須寫成`[ $a == $b ]`。
原生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
-neq:not equal
-gt:great than
-lt:less than
-ge:great than or equal
-le:less than or equal

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

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

#/test.sh a b c接收:

在腳本中可以用“$1”來表示a,“$2”來示b,以此類推。

接收可以用“$”加上選項對應的序號即可。

測試:編寫test14.sh,傳遞a,b,c,輸出其值

其實$1、$2是變量。

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

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


先寫到這裏,其他筆記請查看後續博文~
學習筆記一:基本命令
學習筆記二:基本命令
學習筆記三:Vim
學習筆記四:自有服務
學習筆記五:自有服務
學習筆記六:權限管理
學習筆記七:網絡基礎
學習筆記八:Shell基礎
學習筆記九:Mysql基礎
知識來源:
Linux學習網站
CentOS6.5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章