什麼是Shell?Shell腳本基礎知識

 Shell自己是一個用C語言編寫的程序,它是用戶使用Linux的橋樑。Shell既是一種命令語言,又是一種程序設計語言。做爲命令語言,它交互式地解釋和執行用戶輸入的命令;做爲程序設計語言,它定義了各類變量和參數,並提供了許多在高級語言中才具備的控制結構,包括循環和分支。 shell

它雖然不是Linux系統核心的一部分,但它調用了系統核心的大部分功能來執行程序、創建文件並以並行的方式協調各個程序的運行。所以,對於用戶來講,shell是最重要的實用程序,深刻了解和熟練掌握shell的特性極其使用方法,是用好Linux系統的關鍵。 編程

能夠說,shell使用的熟練程度反映了用戶對Linux使用的熟練程度。 數組

Shell有兩種執行命令的方式: 安全

交互式(Interactive):解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條。 bash

批處理(Batch):用戶事先寫一個Shell腳本(Script),其中有不少條命令,讓Shell一次把這些命令執行完,而沒必要一條一條地敲命令。 數據結構

Shell腳本和編程語言很類似,也有變量和流程控制語句,但Shell腳本是解釋執行的,不須要編譯,Shell程序從腳本中一行一行讀取並執行這些命令,至關於一個用戶把腳本中的命令一行一行敲到Shell提示符下執行。 socket

Shell初學者請注意,在日常應用中,建議您不要用 root 賬號運行 Shell 。做爲普通用戶,無論您有意仍是無心,都沒法破壞系統;但若是是 root,那就不一樣了,只要敲幾個字母,就可能致使災難性後果。 編程語言

幾種常見的Shell
函數

上面提到過,Shell是一種腳本語言,那麼,就必須有解釋器來執行這些腳本。 性能

Linux上常見的Shell腳本解釋器有bash、sh、ash、csh、ksh,習慣上把它們稱做一種Shell。咱們常說有多少種Shell,其實說的是Shell腳本解釋器。

bash

bash是Linux系統默認使用的shell。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的縮寫,內部命令一共有40個。

Linux使用它做爲默認的shell是由於它有諸如如下的特點:
•可使用相似DOS下面的doskey的功能,用方向鍵查閱和快速輸入並修改命令。
•自動經過查找匹配的方式給出以某字符串開頭的命令。
•包含了自身的幫助功能,你只要在提示符下面鍵入help就能夠獲得相關的幫助。

sh

sh 由Steve Bourne開發,是Bourne Shell的縮寫,各類UNIX系統都配有sh。

ash

ash shell 是由Kenneth Almquist編寫的,Linux中佔用系統資源最少的一個小shell,它只包含24個內部命令,於是使用起來很不方便。

csh

csh 是Linux比較大的內核,它由以William Joy爲表明的共計47位做者編成,共有52個內部命令。該shell實際上是指向/bin/tcsh這樣的一個shell,也就是說,csh其實就是tcsh。

ksh

ksh 是Korn shell的縮寫,由Eric Gisin編寫,共有42條內部命令。該shell最大的優勢是幾乎和商業發行版的ksh徹底兼容,這樣就能夠在不用花錢購買商業版本的狀況下嘗試商業版本的性能了。

Shell與編譯型語言的差別

大致上,能夠將程序設計語言能夠分爲兩類:編譯型語言和解釋型語言。

編譯型語言

不少傳統的程序設計語言,例如Fortran、Ada、Pascal、C、C++和Java,都是編譯型語言。這類語言須要預先將咱們寫好的源代碼(source code)轉換成目標代碼(object code),這個過程被稱做「編譯」。

運行程序時,直接讀取目標代碼(object code)。因爲編譯後的目標代碼(object code)很是接近計算機底層,所以執行效率很高,這是編譯型語言的優勢。

可是,因爲編譯型語言多半運做於底層,所處理的是字節、整數、浮點數或是其餘機器層級的對象,每每實現一個簡單的功能須要大量複雜的代碼。例如,在C++裏,就很難進行「將一個目錄裏全部的文件複製到另外一個目錄中」之類的簡單操做。

解釋型語言

解釋型語言也被稱做「腳本語言」。執行這類程序時,解釋器(interpreter)須要讀取咱們編寫的源代碼(source code),並將其轉換成目標代碼(object code),再由計算機運行。由於每次執行程序都多了編譯的過程,所以效率有所降低。

使用腳本編程語言的好處是,它們多半運行在比編譯型語言還高的層級,可以輕易處理文件與目錄之類的對象;缺點是它們的效率一般不如編譯型語言。不過權衡之 下,一般使用腳本編程仍是值得的:花一個小時寫成的簡單腳本,一樣的功能用C或C++來編寫實現,可能須要兩天,並且通常來講,腳本執行的速度已經夠快 了,快到足以讓人忽略它性能上的問題。腳本編程語言的例子有awk、Perl、Python、Ruby與Shell。

何時使用Shell

由於Shell彷佛是各UNIX系統之間通用的功能,而且通過了POSIX的標準化。所以,Shell腳本只要「用心寫」一次,便可應用到不少系統上。所以,之因此要使用Shell腳本是基於:

•簡單性:Shell是一個高級語言;經過它,你能夠簡潔地表達複雜的操做。
•可移植性:使用POSIX所定義的功能,能夠作到腳本無須修改就可在不一樣的系統上執行。
•開發容易:能夠在短期內完成一個功能強大又妤用的腳本。

可是,考慮到Shell腳本的命令限制和效率問題,下列狀況通常不使用Shell:

1.資源密集型的任務,尤爲在須要考慮效率時(好比,排序,hash等等)。 2.須要處理大任務的數學操做,尤爲是浮點運算,精確運算,或者複雜的算術運算(這種狀況通常使用C++或FORTRAN 來處理)。 3.有跨平臺(操做系統)移植需求(通常使用C 或Java)。 4.複雜的應用,在必須使用結構化編程的時候(須要變量的類型檢查,函數原型,等等)。 5.對於影響系統全局性的關鍵任務應用。 6.對於安全有很高要求的任務,好比你須要一個健壯的系統來防止入侵、破解、惡意破壞等等。 7.項目由連串的依賴的各個部分組成。 8.須要大規模的文件操做。 9.須要多維數組的支持。 10.須要數據結構的支持,好比鏈表或數等數據結構。 11.須要產生或操做圖形化界面 GUI。 12.須要直接操做系統硬件。 13.須要 I/O 或socket 接口。 14.須要使用庫或者遺留下來的老代碼的接口。 15.私人的、閉源的應用(shell 腳本把代碼就放在文本文件中,全世界都能看到)。

若是你的應用符合上邊的任意一條,那麼就考慮一下更強大的語言吧——或許是Perl、Tcl、Python、Ruby——或者是更高層次的編譯語言好比C/C++,或者是Java。即便如此,你會發現,使用shell來原型開發你的應用,在開發步驟中也是很是有用的。
相關文章
相關標籤/搜索