1、Shell的作用
Shell除了能解釋用戶輸入的命令,將它傳遞給內核,還可以:
- 調用其他程序,給其他程序傳遞數據或參數,並獲取程序的處理結果。
- 在多個程序之間傳遞數據,把一個程序的輸出作為另一個程序的輸入。
- Shell本身也可以被其他程序調用。
由此可見,Shell是將內核、程序和用戶連接了起來。
Shell本身支持的命令並不多,但是它可以調用其他的程序,每個程序就是一個命令,這使得Shell命令的數量可以無限擴展,其結果就是Shell的功能非常強大,完全能夠勝任 Linux 的日常管理工作,如文本或字符串檢索、文件的查找或創建、大規模軟件的自動部署、更改系統設置、監控服務器性能、發送報警郵件、抓取網頁內容、壓縮文件等。
Shell並不是簡單的堆砌命令,我們還可以在Shell中編程,這和使用 C/C++、Java、Python 等常見的編程語言並沒有什么兩樣。
Shell雖然沒有 C/C++、Java、Python 等強大,但也支持了基本的編程元素,例如:
if...else選擇結構,switch...case開關語句,for、while、until循環。- 變量、數組、字符串、注釋、加減乘除、邏輯運算等概念。
- 函數,包括用戶自定義的函數和內置函數(例如 printf、export、eval 等)。
Shell也是一種編程語言,它的編譯器(解釋器)是Shell這個程序。我們平時所說的Shell,有時候是指連接用戶和內核的這個程序,有時候又是指Shell編程。
Shell主要用來開發一些實用的、自動化的小工具,而不是用來開發具有復雜業務邏輯的中大型軟件,例如檢測計算機的硬件參數、一鍵搭建Web開發環境、日志分析等,Shell都非常合適。
使用Shell的熟練程度反映了用戶對 Linux 的掌握程度,運維工程師、網絡管理員、程序員都應該學習Shell。
尤其是 Linux 運維工程師,Shell更是必不可少的,是必須掌握的技能,它使得我們能夠自動化地管理服務器集群,否則你就得一個一個地登錄所有的服務器,對每一台服務器都進行相同的設置,而這些服務器可能有成百上千之多,會浪費大量的時間在重復性的工作上。
2、Shell的分類
目前Shell的版本有很多種,如BourneShell、CShell、Bash、ksh、tcsh等,它們各有特點。
如下圖所示:

下面簡要介紹幾個重點的Shell版本。
- 最重要的Shell是
BourneShell,這個命名是為了紀念此Shell的發明者Steven Bourne。從 1979 年起,UNIX 就開始使用BourneShell。BourneShell的主文件名為sh,開發人員便以sh作為BourneShell的主要識別名稱。
雖然 Linux 與 UNIX 一樣,可以支持多種Shell,但BourneShell的重要地位至今仍然沒有改變,許多 UNIX 系統中仍然使用sh作為重要的管理工具。它的工作從開機到關機,幾乎無所不包。在Linux中,用戶Shell主要是 Bash,但在啟動腳本、編輯等很多工作中仍然使用BourneShell。 CShell是廣為流行的Shell變種。CShell主要在 BSD 版的 UNIX系統中使用,發明者是柏克萊大學的Bill Joy。CShell因為其語法和C語言類似而得名,這也使得UNIX的系統工程師在學習CShell時感到相當方便。BashShell也就是Bourne Again (Bash), 是 GNU 計划的重要工具之一,也是 GNU 系統中標准的Shell。Bash 與 sh 兼容,所以許多早期開發出來的BourneShell程序都可以繼續在 Bash 中運行。現在使用的 Linux 就使用 Bash 作為用戶的基本Shell。
Bash 於 1988 年發布,並在 1995-1996年推出Bash 2.0。在這之前,廣為使用的版本是1.14,Bash 2.0增加了許多新的功能,以及具備更好的兼容性。
總結:
Shell的兩種主要語法類型有
Bourne和C,這兩種語法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcsh(Bash和zsh在不同程度上支持csh的語法)。
參考:
