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