使用者、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是bash 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程式設計的詳細內容,更多請關注TW511.COM其它相關文章!