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