Shell 簡介
1. Shell 概述
1.1 Shell 是什么
我們要系統(tǒng)性地學(xué)習(xí) Shell 腳本,首先需要知道什么是 Shell,Shell 翻譯過來為殼,例如大家常見的殼牌石油的圖標(biāo)上面的貝殼,顧名思義其就是一個(gè)套在操作系統(tǒng)外層的殼,用戶可以通過與這層殼的交互,將自己的需求利用這層 Shell 來執(zhí)行來實(shí)現(xiàn)對服務(wù)器的操作。我們可以認(rèn)為 Shell 是將用戶的命令解析為內(nèi)核可以執(zhí)行的命令,起到命令解釋的作用,是用戶與操作系統(tǒng)直接的一個(gè)橋梁紐帶。
1.2 為什么要用 Shell
我們想讓操作系統(tǒng)為我們干一件事情,我們不需要去了解內(nèi)在的內(nèi)核指令,而是只需要了解可以操作系統(tǒng)的 Shell 命令即可,Shell 為我們屏蔽來操作系統(tǒng)底層的細(xì)節(jié),也出于安全性考慮,不能讓用戶隨意的進(jìn)行操作系統(tǒng)內(nèi)核的操作,通俗來說,shell 就是讓用戶更簡單的操作計(jì)算機(jī)。
1.3 Shell 腳本是什么
我們知道了 Shell 是一個(gè)用戶與 Linux 系統(tǒng)內(nèi)核的通訊的橋梁后,那么 Shell 腳本是什么呢?
Shell 腳本就是操作 Shell 的指令集合編寫成的一段實(shí)現(xiàn)目的需求的代碼,也為一種管理 Linux 系統(tǒng)的腳本語言,我們可以簡單地將其理解為,Linux 的各種指令加上一些流程控制和數(shù)據(jù)的集合,因?yàn)樗€有不少的語法及格式,后面我們來通過學(xué)習(xí),詳細(xì)剖析其內(nèi)在精髓。
1.4 市場位置
目前 Shell 腳本由于其作為直接與 Linux 系統(tǒng)交互,在批量 / 定時(shí)任務(wù)中有著獨(dú)特?zé)o可取代的作用,不管是運(yùn)維人員還是開發(fā)人員熟練掌握 Shell 腳本,都會給日后的工作帶來非常大的便利,Shell 作為一種腳本語言,編寫完源碼后不用編譯,直接運(yùn)行源碼即可,是實(shí)現(xiàn) Linux/UNIX 系統(tǒng)管理及自動化運(yùn)維所必備的重要工具, 只有熟練掌握 Shell 才能提升運(yùn)維人員的工作效率,適應(yīng)日益復(fù)雜的工作環(huán)境,減少不必要的重復(fù)工作,從而為個(gè)人的職場發(fā)展奠定較好的基礎(chǔ)。
2. Shell 分類
我們知道與 Linux 內(nèi)核我們打交道的都有什么呢?通常有兩種方式,即圖形界面 (GUI Shell)和終端命令行 (CLI Shell)。
2.1 GUI Shell
如果我們不熟悉 Linux 命令,我們通過 VNC 登錄到 Linux 系統(tǒng)后,利用鼠標(biāo)去雙擊文件夾進(jìn)入目錄,或新建文件夾,編輯文件,安裝 rpm 包等,這些操作都是利用 GUI Shell 與 Linux 系統(tǒng)內(nèi)核通訊,它為我們構(gòu)造了一套類似 Windows 的界面優(yōu)化的桌面環(huán)境,目前的桌面環(huán)境例如 Gnome/KDE 等,此類為 GUI Shell。
2.2 CLI Shell
Linux 作為服務(wù)器端,運(yùn)行桌面環(huán)境非常消耗資源,因此 CLI Shell 才是我們本次的重點(diǎn),其根據(jù)不同的系統(tǒng)有很多種類。
例如我們最常用的主流版本的 Linux 系統(tǒng) CentOS/RHEL 的默認(rèn) Shell 為 bash
,當(dāng)然還有很多其他的 Shell,為什么有這么多類型的 Shell 內(nèi)核,因?yàn)閷τ诓煌牟僮飨到y(tǒng)類型,其內(nèi)核都難免存在差異,因此與內(nèi)核交互的 Shell 也就分了不少種類,目前在 Linux 系統(tǒng)上主流的 CLI Shell 都為 Bash,是許多 Linux 發(fā)行版默認(rèn)的 Shell。我們可以在 Linux 系統(tǒng)上 cat /etc/shells
來查看本版本支持的各 Shell 類型,同時(shí)可以利用命令 echo $SHELL
來查看當(dāng)前環(huán)境中的默認(rèn) Shell,不同的 Shell 都有其各自的特點(diǎn),目前主流的 Shell 類型如下:
- Bourne Again Shell(/bin/bash):其為目前主流 Linux 發(fā)行版默認(rèn)的 Shell,其也是 Bourne shell 最早的發(fā)行并免費(fèi)的版本,用戶可以利用其 help 命令來查看幾乎 Shell 的所用功能;
- Bourne Shell(/usr/bin/sh 或 /bin/sh):是一個(gè)快捷方式,后來已經(jīng)被 /bin/bash 所取代;
- C Shell(/usr/bin/csh):簡單高效,其使用類似 C 語言的語法,后已被 tcsh 取代;
- K Shell(/usr/bin/ksh):Korn shell 的語法與 Bourne shell 相同,同時(shí)具備了 C shell 的易用特點(diǎn),許多安裝腳本都使用 ksh。
3. 應(yīng)用場景
- 應(yīng)用安裝:我們都知道在 Linux 服務(wù)器經(jīng)常需要我們安裝配置一些軟件或配置環(huán)境,人手工的一條命令一條命令執(zhí)行,很容易出現(xiàn)錯誤,而且如果成百上千臺服務(wù)器,那么此場景下 Shell 腳本就非常適合,編寫一個(gè)應(yīng)用安裝配置腳本,后期可以重復(fù)使用,且不容易出錯,Shell 腳本適用于重復(fù)性的工作;
- 定時(shí)任務(wù):例如我們需要每分鐘上報(bào)服務(wù)器的各項(xiàng)性能指標(biāo)到監(jiān)控服務(wù)端,此時(shí)可以寫一個(gè)采集系統(tǒng)各項(xiàng)指標(biāo)的腳本,然后配合定時(shí)任務(wù)來每分鐘執(zhí)行指標(biāo)數(shù)據(jù)上報(bào),Shell 腳本非常適用于周期性的工作;
- 應(yīng)用操作:例如我們自己寫的應(yīng)用,可以為其編寫啟動 / 停止 / 重啟等操作的腳本,將腳本添加進(jìn)系統(tǒng)環(huán)境中,后期很方便進(jìn)行服務(wù)管理;
- 備份恢復(fù):可以利用腳本來進(jìn)行網(wǎng)站文件或數(shù)據(jù)庫的異地備份,以及恢復(fù)到測試環(huán)境進(jìn)行驗(yàn)證等;
- CI/CD: Shell 腳本適用于 DevOPS 中的在服務(wù)器中持續(xù)集成持續(xù)部署的 pipeline 流程中,適用于應(yīng)用發(fā)布最后一公里配置;
- 其他:當(dāng)然 Shell 還可以做一些其他工作,比如運(yùn)算 / 生成報(bào)表,甚至有大佬用 Shell 編寫游戲等,可以根據(jù)自己的需求來利用好 Shell 腳本來為自己服務(wù)。
4. 學(xué)習(xí)基礎(chǔ)
學(xué)習(xí) Shell 腳本非常簡單,需要有一臺 Linux 系統(tǒng),系統(tǒng)類型可以是 CentOS/RedHat 或 Ubuntu,由于不同的系統(tǒng)使用的 Shell 類型可能存在異常,建議使用 CentOS 7 系統(tǒng)來學(xué)習(xí)本示例。