1. 程式人生 > 實用技巧 >作業系統_4:shell基礎

作業系統_4:shell基礎

目錄:

1、Shell是什麼?1分鐘理解Shell的概念!

2、Linux Shell指令碼攻略

3、一篇文章讓你徹底掌握 shell 語言

1、Shell是什麼?1分鐘理解Shell的概念!

現在我們使用的作業系統(Windows、Mac OS、Android、iOS 等)都是帶圖形介面的,簡單直觀,容易上手,對專業使用者(程式設計師、網管等)和普通使用者(家庭主婦、老年人等)都非常適用;計算機的普及離不開圖形介面。

然而在計算機的早期並沒有圖形介面,我們只能通過一個一個地命令來控制計算機,這些命令有成百上千之多,且不說記住這些命令非常困難,每天面對沒有任何色彩的“黑屏”本身就是一件枯燥的事情;這個時候的計算機還遠遠談不上炫酷和普及,只有專業人員才能使用。


圖:早期的電腦,都是“黑紙白字”
猛擊《帶你逛西雅圖活電腦博物館》可以欣賞更多早期的計算機。

對於圖形介面,使用者點選某個圖示就能啟動某個程式;對於命令列,使用者輸入某個程式的名字(可以看做一個命令)就能啟動某個程式。這兩者的基本過程都是類似的,都需要查詢程式在硬碟上的安裝位置,然後將它們載入到記憶體執行。

關於程式的執行原理,請猛擊《載入記憶體,讓程式執行起來》。

換句話說,圖形介面和命令列要達到的目的是一樣的,都是讓使用者控制計算機。

然而,真正能夠控制計算機硬體(CPU、記憶體、顯示器等)的只有作業系統核心(Kernel),圖形介面和命令列只是架設在使用者和核心之間的一座橋樑。

如果你不瞭解作業系統的作用,請轉到《
作業系統是什麼
》。

由於安全、複雜、繁瑣等原因,使用者不能直接接觸核心(也沒有必要),需要另外再開發一個程式,讓使用者直接使用這個程式;該程式的作用就是接收使用者的操作(點選圖示、輸入命令),並進行簡單的處理,然後再傳遞給核心,這樣使用者就能間接地使用作業系統核心了。你看,在使用者和核心之間增加一層“代理”,既能簡化使用者的操作,又能保障核心的安全,何樂不為呢?

使用者介面和命令列就是這個另外開發的程式,就是這層“代理”。在Linux下,這個命令列程式叫做Shell

Shell 是一個應用程式,它連線了使用者和 Linux 核心,讓使用者能夠更加高效、安全、低成本地使用 Linux 核心,這就是 Shell 的本質。

Shell 本身並不是核心的一部分,它只是站在核心的基礎上編寫的一個應用程式,它和 QQ、迅雷、Firefox 等其它軟體沒有什麼區別。然而 Shell 也有著它的特殊性,就是開機立馬啟動,並呈現在使用者面前;使用者通過 Shell 來使用 Linux,不啟動 Shell 的話,使用者就沒辦法使用 Linux。

Shell 是如何連線使用者和核心的?

Shell 能夠接收使用者輸入的命令,並對命令進行處理,處理完畢後再將結果反饋給使用者,比如輸出到顯示器、寫入到檔案等,這就是大部分讀者對 Shell 的認知。你看,我一直都在使用 Shell,哪有使用核心哦?我也沒有看到 Shell 將我和核心連線起來呀?!

其實,Shell 程式本身的功能是很弱的,比如檔案操作、輸入輸出、程序管理等都得依賴核心。我們執行一個命令,大部分情況下 Shell 都會去呼叫核心暴露出來的介面,這就是在使用核心,只是這個過程被 Shell 隱藏了起來,它自己在背後默默進行,我們看不到而已。

介面其實就是一個一個的函式,使用核心就是呼叫這些函式。這就是使用核心的全部內容了嗎?嗯,是的!除了函式,你沒有別的途徑使用核心。

比如,我們都知道在 Shell 中輸入cat log.txt命令就可以檢視 log.txt 檔案中的內容,然而,log.txt 放在磁碟的哪個位置?分成了幾個資料塊?在哪裡開始?在哪裡終止?如何操作探頭讀取它?這些底層細節 Shell 統統不知道的,它只能去呼叫核心提供的 open() 和 read() 函式,告訴核心我要讀取 log.txt 檔案,請幫助我,然後核心就乖乖地按照 Shell 的吩咐去讀取檔案了,並將讀取到的檔案內容交給 Shell,最後再由 Shell 呈現給使用者(其實呈現到顯示器上還得依賴核心)。整個過程中 Shell 就是一個“中間商”,它在使用者和核心之間“倒賣”資料,只是使用者不知道罷了。

Shell 還能連線其它程式

在 Shell 中輸入的命令,有一部分是 Shell 本身自帶的,這叫做內建命令;有一部分是其它的應用程式(一個程式就是一個命令),這叫做外部命令。

Shell 本身支援的命令並不多,功能也有限,但是 Shell 可以呼叫其他的程式,每個程式就是一個命令,這使得 Shell 命令的數量可以無限擴充套件,其結果就是 Shell 的功能非常強大,完全能夠勝任 Linux 的日常管理工作,如文字或字串檢索、檔案的查詢或建立、大規模軟體的自動部署、更改系統設定、監控伺服器效能、傳送報警郵件、抓取網頁內容、壓縮檔案等。

更加驚訝的是,Shell 還可以讓多個外部程式發生連線,在它們之間很方便地傳遞資料,也就是把一個程式的輸出結果傳遞給另一個程式作為輸入。

大家所說的 Shell 強大,並不是 Shell 本身功能豐富,而是它擅長使用和組織其他的程式。Shell 就是一個領導者,這正是 Shell 的魅力所在。

可以將 Shell 在整個 Linux 系統中的地位描述成下圖所示的樣子。注意“使用者”和“其它應用程式”是通過虛線連線的,因為使用者啟動 Linux 後直接面對的是 Shell,通過 Shell 才能執行其它的應用程式。

Shell 也支援程式設計

Shell 並不是簡單的堆砌命令,我們還可以在 Shell 中程式設計,這和使用C++C#JavaPython等常見的程式語言並沒有什麼兩樣。

Shell 雖然沒有 C++、Java、Python 等強大,但也支援了基本的程式設計元素,例如:

  • if...else 選擇結構,case...in 開關語句,for、while、until 迴圈;
  • 變數、陣列、字串、註釋、加減乘除、邏輯運算等概念;
  • 函式,包括使用者自定義的函式和內建函式(例如 printf、export、eval 等)。


站在這個角度講,Shell 也是一種程式語言,它的編譯器(直譯器)是 Shell 這個程式。我們平時所說的 Shell,有時候是指連線使用者和核心的這個程式,有時候又是指 Shell 程式設計。

Shell 主要用來開發一些實用的、自動化的小工具,而不是用來開發具有複雜業務邏輯的中大型軟體,例如檢測計算機的硬體引數、搭建 Web 執行環境、日誌分析等,Shell 都非常合適。

使用 Shell 的熟練程度反映了使用者對 Linux 的掌握程度,運維工程師、網路管理員、程式設計師都應該學習 Shell。

尤其是 Linux 運維工程師,Shell 更是必不可少的,是必須掌握的技能,它使得我們能夠自動化地管理伺服器叢集,否則你就得一個一個地登入所有的伺服器,對每一臺伺服器都進行相同的設定,而這些伺服器可能有成百上千之多,會浪費大量的時間在重複性的工作上。

Shell 是一種指令碼語言

任何程式碼最終都要被“翻譯”成二進位制的形式才能在計算機中執行。

有的程式語言,如 C/C++、Pascal、Go語言、彙編等,必須在程式執行之前將所有程式碼都翻譯成二進位制形式,也就是生成可執行檔案,使用者拿到的是最終生成的可執行檔案,看不到原始碼。

這個過程叫做編譯(Compile),這樣的程式語言叫做編譯型語言,完成編譯過程的軟體叫做編譯器(Compiler)。

而有的程式語言,如 Shell、JavaScript、Python、PHP等,需要一邊執行一邊翻譯,不會生成任何可執行檔案,使用者必須拿到原始碼才能執行程式。程式執行後會即時翻譯,翻譯完一部分執行一部分,不用等到所有程式碼都翻譯完。

這個過程叫做解釋,這樣的程式語言叫做解釋型語言或者指令碼語言(Script),完成解釋過程的軟體叫做直譯器。

編譯型語言的優點是執行速度快、對硬體要求低、保密性好,適合開發作業系統、大型應用程式、資料庫等。

指令碼語言的優點是使用靈活、部署容易、跨平臺性好,非常適合 Web 開發以及小工具的製作。

Shell 就是一種指令碼語言,我們編寫完原始碼後不用編譯,直接執行原始碼即可。