linux的學習Ⅷ(shell基礎)

2020-08-13 16:03:30

一、關於shell

1、什麼是shell

Shell(外殼) 是一個用 C 語言編寫的程式,它是使用者使用 Linux 的橋樑。Shell 既是一種命令語言,又是一種程式設計語言。
Shell 是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面存取操作系統內核的服務。
Shell屬於內建的指令碼,程式開發的效率非常高,依賴於功能強大的命令可以迅速地完成開發任務(批次處理),語法簡單,程式碼寫起來比較輕鬆,簡單易學

指令碼簡單地說就是一條條的文字命令,這些文字命令是可以看到的(如可以用記事本開啓檢視、編輯)。
常見的指令碼: JavaScript(JS,前端),VBScript, ASP,JSP,PHP(後端),SQL(數據庫操作語言),Perl,Shell,python,Ruby,JavaFX,Lua等。

常見的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指令碼 指令碼必須得有執行許可權

案例:建立test.sh,實現第一個shell指令碼程式,輸出hello world.
輸出命令:#echo 123
注意:輸出的內容如果包含字母和符號(不包含變數),則需要用引號包括起來。如果是純數位可以包也可以不包。這裏在執行時一定要寫成 ./test.sh,而不是 test.sh,執行其它二進制的程式也一樣
指令碼執行的另外一個方式:/bin/bash 指令碼的路徑

二、shell進階

1、變數(重點)

1.1、變數的含義

在一個指令碼週期內,其值可以發生改變的量就是變數。變數是shell中不可或缺的一部分,也是最基礎、最重要的組成部分。

1.2、變數的定義與使

變數,先定義後使用。

定義形如:class_name="yunwe "
使用形如:echo $class_name

在使用變數的時候一定需要在變數名前面新增一個$符號,該要求在其他語言中也存在的(例如php)。

變數名的規範
注意,變數名後面的等號左右不能有空格,這可能和你熟悉的所有程式語言都不一樣。同時,變數名的命名须遵循如下規則:
命名只能使用英文字母,數位和下劃線,首個字元不能以數位開頭;中間不能有空格,可以使用下劃線「_」;不能使用標點符號;不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)。

關於單雙引號的問題
雙引號能夠識別變數,雙引號能夠實現跳脫(類似於「*」)
單引號是不能識別變數,只會原樣輸出,單引號是不能跳脫的

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

1.3、只讀變數

語法:readonly 變數名(不含$)

1.4、接收使用者輸入

語法:read -p 提示資訊 變數名

1.5、刪除變數

語法:unset 變數名

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:
運算子	說明	舉例
+	加法	`expr $a + $b` 結果爲 30。
-	減法	`expr $a - $b` 結果爲 -10。
*	乘法	`expr $a \* $b` 結果爲  200。
/	除法	`expr $b / $a` 結果爲 2。
%	取餘	`expr $b % $a` 結果爲 0。
=	賦值	a=$b 將把變數 b 的值賦給 a。
==	相等。用於比較兩個數位,相同則返回 true(真)。	[ $a == $b ] 返回 false(假)。
!=	不相等。用於比較兩個數位,不相同則返回 true。	[ $a != $b ] 返回 true。

注意:條件表達式要放在方括號之間,並且要有空格,例如:[a==a==b] 是錯誤的,必須寫成 [ $a == $b ]。
原生bash不支援簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。
expr 是一款表達式計算工具,使用它能完成表達式的求值操作。但要注意使用的是反引號而不是單引號

兩點注意
表達式和運算子之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數程式語言不一樣。且完整的表達式要被反引號包含,注意這個字元不是單引號

3.2、關係運算符

關係運算符只支援數位,不支援字串,除非字串的值是數位。

下表列出了常用的關係運算符,假定變數 a 爲 10,變數 b 爲 20:
運算子	說明	舉例
-eq	檢測兩個數是否相等,相等返回 true。	[ $a -eq $b ] 返回 false。
-ne 檢測兩個數是否相等,不相等返回 true。	[ $a -ne $b ] 返回 true。
-gt	檢測左邊的數是否大於右邊的,如果是,則返回 true。	[ $a -gt $b ] 返回 false。
-lt	檢測左邊的數是否小於右邊的,如果是,則返回 true。	[ $a -lt $b ] 返回 true。
-ge	檢測左邊的數是否大於等於右邊的,如果是,則返回 true。	[ $a -ge $b ] 返回 false。
-le	檢測左邊的數是否小於等於右邊的,如果是,則返回 true。	[ $a -le $b ] 返回 true。
-eq:equal
-ne:not equal
-gt:great than
-lt:less than
-ge:great than or equal
-le:less than or equal
3.3、邏輯運算子
下表列出了常用的布爾運算子,假定變數 a 爲 10,變數 b 爲 20:
運算子	說明	舉例
!	非運算,表達式爲 true 則返回 false,否則返回 true。	[ ! false ] 返回 true。
-o	或(或者)運算,有一個表達式爲 true 則返回 true。	[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a	與(並且)運算,兩個表達式都爲 true 才返回 true。	[ $a -lt 20 -a $b -gt 100 ] 返回 false。

或運算:一個爲真即爲真,全部爲假纔是假
與運算:一個爲假即爲假,全部爲真纔是真
3.4、字串運算子
下表列出了常用的字串運算子,假定變數 a 爲 "abc",變數 b 爲 "efg":
運算子	說明	舉例
=	檢測兩個字串是否相等,相等返回 true。	[ $a = $b ] 返回 false。
!=	檢測兩個字串是否相等,不相等返回 true。	[ $a != $b ] 返回 true。
-z	檢測字串長度是否爲0,爲0返回 true。	[ -z $a ] 返回 false。
-n	檢測字串長度是否爲0,不爲0返回 true。	[ -n $a ] 返回 true。
str	檢測字串是否爲空,不爲空返回 true。	[ $a ] 返回 true。

3.5、檔案測試運算子

檔案測試運算子用於檢測 Unix/Linux 檔案的各種屬性。

屬性檢測描述如下:
操作符	說明	舉例
-b file	檢測檔案是否是塊裝置檔案,如果是,則返回 true。	[ -b $file ] 返回 false。
-c file	檢測檔案是否是字元裝置檔案,如果是,則返回 true。	[ -c $file ] 返回 false。
-d file	檢測檔案是否是目錄,如果是,則返回 true。	[ -d $file ] 返回 false。
-f file	檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案),如果是,則返回 true。	[ -f $file ] 返回 true。
-g file	檢測檔案是否設定了 SGID 位,如果是,則返回 true。	[ -g $file ] 返回 false。
-k file	檢測檔案是否設定了粘着位(Sticky Bit),如果是,則返回 true。	[ -k $file ] 返回 false。
-p file	檢測檔案是否是有名管道,如果是,則返回 true。	[ -p $file ] 返回 false。
-u file	檢測檔案是否設定了 SUID 位,如果是,則返回 true。	[ -u $file ] 返回 false。
-r file	檢測檔案是否可讀,如果是,則返回 true。	[ -r $file ] 返回 true。
-w file	檢測檔案是否可寫,如果是,則返回 true。	[ -w $file ] 返回 true。
-x file	檢測檔案是否可執行,如果是,則返回 true。	[ -x $file ] 返回 true。
-s file	檢測檔案是否爲空(檔案大小是否大於0),不爲空返回 true。	[ -s $file ] 返回 true。
-e file	檢測檔案(包括目錄)是否存在,如果是,則返回 true。	[ -e $file ] 返回 true。

4、shell指令碼附帶選項

問題描述:在linux shell中如何處理tail -10 access.log這樣的命令列選項?
步驟:呼叫tail指令,系統把後續選項傳遞給tail,Tail先去開啓指定的檔案,取出最後10行

問題:自己寫的shell是否也可以像內建命令一樣傳遞一些選項呢?
答:可以的,傳遞方式與上述的描述是一樣的,關鍵是怎麼接收。
例如
傳遞:#./test.sh a b c
接收:在指令碼中可以用「$1」來表示a,「$2」來表示b,以此類推。接收可以用「$」加上選項對應的序號即可。

本文只用於個人學習與記錄