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
的語法)。
參考: