這篇文章為大家帶來了linux系統中shell程式設計的相關知識,在學習Shell程式設計之前,我們應該要先知道什麼是Shell,還有什麼是shell腳本,希望對大家有幫助。
# 使用者、Shell、Linux核心、硬體的關係如下圖:
Shell是應用程式,也可以說是一個命令解譯器,它是使用者解釋器,它是使用者和Linux內核之間的橋樑,可以將使用者在圖形介面上的操作或在終端輸入的命令傳遞給Linux內核,然後Linux內核再調度各個硬體及其他資源來完成使用者的操作。
什麼是Linux的核心?在Linux作業系統中,真正能夠操作電腦硬體完成某個使用者功能的那一部分被稱為Linux系統的核心。使用者在使用Linux系統時,是不可以直接操作核心的,而是透過Shell來間接的操作核心的。 Shell不屬於內核的一部分,而是在Linux內核之外開發的應用程序,它將接收到的用戶滑鼠點擊操作或輸入的命令傳遞給內核,而內核再去調度硬體去完成指定的操作。這樣使用者就不需要直接操作內核,而是透過Shell間接地操作內核,內核也不會被直接的暴露於外部,保障了內核的安全性,也簡化了使用者的操作。
Shell這個應用程式是開機即啟動的,我們在操作Linux系統時,無時不刻都在直接或間接地透過Shell去操作Linux核心。其實,在沒有圖形化介面之前,使用者是透過終端機或是控制台直接去呼叫Shell這個應用程序,然後透過輸入指令來操作Linux系統的。使用者在控制台或終端機上看到的 $ 和 # 其實就是Shell的命令提示符,這表示使用者已經進入了Shell這個程序,只需要輸入指令,即可透過Shell來操作Linux核心。只不過root用戶登入顯示$,而普通用戶登入顯示#。
另外,Shell在將使用者的操作傳遞給核心的過程,就是在呼叫核心所提供的API介面的過程。例如,使用者在圖形介面或終端命令列做了一個開啟檔案的操作,而這個使用者的操作Shell接收到後,就會去呼叫核心提供的對應的函數,然後核心再去調度硬體資源來完成使用者的操作。
我們知道,Linux 是一個開源的作業系統,它是由世界各地的多個組織機構或個人共同開發的,每個組織機構或個人負責一部分功能,最後組合在一起,就構成了現在我們使用的Linux。也正是這個原因,這些不同的組織機構或個人都會開發出可以在Linux系統中使用的應用程序,而這些應用程式的功能可能是類似的,各有優缺點,至於使用哪一個由用戶選擇。而Shell就是這樣的一個應用程序,所以Shell有很多個版本,目前Linux的大多數發行版預設使用的Shell是 bash shell。其他常見的Shell版本如下:
(1) sh:sh 的全名是 Bourne shell,是 UNIX 上的標準 shell,許多 UNIX 版本都配有 sh。 sh 是第一個流行的 Shell。
(2) csh:這個 shell 的語法有點類似C語言,所以才得名為 C shell ,簡稱為 csh。
(3) tcsh:tcsh 是 csh 的增強版,加入了指令補全功能,提供了更強大的語法支援。
(4) ash:一個輕量佔用資源少的 Shell,適合運行於低記憶體環境,與 bash shell 完全相容。
(5) bash:bash shell 由 GNU 組織開發,維持了對 sh shell 的相容性,是各種 Linux 發行版預設設定的 shell。
在Linux系統中,一般預設使用的Shell是使用的Shell為一般。 Shell是一個應用程序,一般都是放在/bin
或/user/bin
目錄下,而當前Linux 系統可用的Shell 都記錄在/etc/shells
檔案中。
(1) 檢視系統目前可用的Shell,執行指令【cat -n /etc/shells】:
(2) 檢視系統目前默認使用的shell,執行指令【echo $SHELL】:
(3) 查看個別使用者使用的Shell,執行指令【cat -n /etc/passwd】:
我們已經知道,Shell是一個應用程序,而這個應用程式不單單只是可以將用戶的操作命令傳遞給Linux內核,它也支援程式設計。 Shell都會對應一套程式語言的語法,而這套語言就被稱為Shell程式語言或Shell腳本語言。 Shell程式語言和JavaScript語言一樣是一種腳本語言,它不需要編譯,而它的解釋器就是Shell應用程式本身。
我們平常工作所說的Shell,大多數情況指的是Shell腳本語言,而不是Shell應用程式。
我們在使用Shell腳本語言時,可以和Linux系統的其他操作指令結合使用(如ls、grep等等),而我們使用Shell腳本語言和其他指令結合編寫能夠完成某個特定功能的副檔名為.sh的文本,就叫做Shell腳本程式。
我們已經知道,Shell有許多版本,而每個版本所支援的Shell腳本語言語法可能是有差異的,而下面的關於Shell腳本的所有例子都是針對於Bash Shell這個版本而言。
(1)在根目錄下新建一個Hello.sh腳本:【vim Hello.sh】
(2)然後輸入以下內容:
#!/bin/bash echo "Hello World "
第一行:#! 是一個約定標記,它可以告訴系統這個腳本要使用哪個Shell版本作為解釋器,後面緊接的/bin/bash則是Shell的所在路徑,所以【#!/bin/bash 】表示聲明使用bin目錄下的bash shell 作為這個腳本的解釋器;
第二行:【echo "Hello World "】表示輸出文字Hello World ! ;
(3)然後儲存退出:【!wq】;
(4)這樣,一個能夠輸出 Hello World !的腳本就編寫完成。
補充說明:
上面我們已經說過,Shell程式就是Shell腳本語言的解釋器,而我們在使用終端機時(例如透過Xshell連接Linux伺服器的終端),其實就是已經進入了Shell這個程序,所以其實我們是可以在終端直接輸入Shell程式語言的程式碼來運行的,而不需要寫在腳本裡再去運行。例如,宣告一個變數並列印這個變數的值:
(1)輸入程式碼:【name=張三】,表示定義了一個變數name,它的值為張三;
(2)輸入代碼:【echo $name】,表示列印變數name的值。
當然,這種方式只適合執行邏輯簡單只有一兩句程式碼的情況,大多數情況下我們還是將Shell程式碼寫在.sh腳本中再去執行。
上面我們已經寫了一個能夠輸出 Hello World !的Shell腳本運行,而現在我們就要執行 Hello.sh 這個腳本。而Shell腳本的執行方式有兩種:
第一種:給予.sh文字執行權限,然後執行文字:
(1)先給予Shell腳本可執行權限:【chmod x
Hello.sh
】;
(2)直接執行:絕對路徑:【/Hello.sh】 或 相對路徑: 【./Hello.sh】
注意,而這裡執行時如果使用的是相對路徑,必須以./開頭,表示目前目錄,否則系統會找不到不到腳本,從而導致執行失敗。
第二種:將Shell 腳本作為參數傳遞給Bash Shell 解釋器:
(1)這裡使用Bash Shell來作為解釋器,那麼我們直接調用Bash Shell 這個程序,然後把Hello.sh這個腳本當作參數傳給Shell即可:【/bin/bash Hello.sh】或【bash Hello.sh】
(2)這裡需要注意,使用這種方式執行Shell腳本時,在Shell腳本的第一行中就不需要聲明使用哪個版本的Shell來作為解釋器,也就是不需要這行程式碼【#!/ bin/bash】,因為我們在執行腳本的指令中【/bin/bash Hello.sh】,就已經指明了使用哪個版本的Shell作為解釋器。
注意,這種方式執行腳本檔案時,如果使用的是相對路徑,那麼【/bin/bash ./Hello.sh】和【/bin/bash Hello.sh】是一樣的,並且無使用第一種執行方式中的差異。
相關推薦:《Linux影片教學》
以上是完全掌握Linux系統的Shell編程的詳細內容。更多資訊請關注PHP中文網其他相關文章!