一、為什么要學習 Shell 編程 ?
1)Linux運維工程師在進行服務器集群管理時,需要編寫Shell程序來進行服務器管理。
2)對于 JavaEE 和 Python 程序員來說,工作的需要,要求你編寫一些 Shell腳本進行程序或者是服務器的維護,比如編寫一個定時備份數(shù)據(jù)庫的腳本。
3) 對于大數(shù)據(jù)程序員來說,需要編寫Shell程序來管理集群。
二、Shell 使用場景
①、Shell 是什么?
????????由于安全、復雜、繁瑣等原因,用戶不能直接接觸內(nèi)核(也沒有必要),需另外再開發(fā)一個程序讓用戶直接使用這個程序;該程序作用就是接收用戶操作(點擊圖標、輸入命令)并進行簡單處理,然后再傳遞給內(nèi)核,這樣用戶就能間接地使用操作系統(tǒng)內(nèi)核了。在用戶和內(nèi)核之間加一層“代理”,既能簡化操作又能保障內(nèi)核安全。
????????這個另外開發(fā)的程序就是這層“代理”。Linux下這個命令行程序叫?Shell。是一個應用程序,讓用戶能夠更加高效、安全、低成本地使用 Linux 內(nèi)核,這就是 Shell 的本質(zhì)。Shell 本身并不是內(nèi)核的一部分,它只是站在內(nèi)核基礎上編寫的一個應用程序,和 QQ、迅雷、Firefox 等其它軟件沒有什么區(qū)別。然而 Shell 也有著它的特殊性就是開機立馬啟動;用戶通過 Shell 來使用 Linux,不啟動 Shell 的話用戶就沒辦法使用 Linux。
②、Shell?如何連接用戶和內(nèi)核?
????????Shell 程序本身功能是很弱的,比如文件操作、輸入輸出、進程管理等都得依賴內(nèi)核。運行一個命令,大部分情況下 Shell 會去調(diào)用內(nèi)核暴露出來的接口,這就是在使用內(nèi)核,只是這個過程被 Shell 隱藏了起來,它自己在背后默默進行看不到而已。
????????接口其實就是一個個函數(shù),使用內(nèi)核就是調(diào)用這些函數(shù)。這就是使用內(nèi)核全部內(nèi)容了嗎?嗯,是的!除了函數(shù),沒有別的途徑使用內(nèi)核。比如Shell 中輸入cat log.txt
命令就可以查看 log.txt 文件中的內(nèi)容,然而log.txt 放在磁盤的哪個位置?分成了幾個數(shù)據(jù)塊?在哪里開始?在哪里終止?如何操作探頭讀取它?這些底層細節(jié) Shell 統(tǒng)統(tǒng)不知道的,它只能去調(diào)用內(nèi)核提供的 open() 和 read() 函數(shù),告訴內(nèi)核我要讀取 log.txt 文件,然后內(nèi)核就按照 Shell 的吩咐去讀取文件了,并將讀取到的文件內(nèi)容交給 Shell,最后由 Shell 呈現(xiàn)給用戶(其實呈現(xiàn)到顯示器上還得依賴內(nèi)核)。整個過程?Shell 就是一個“中間商”,它在用戶和內(nèi)核之間“倒賣”數(shù)據(jù)。
三、Shell 連接其它程序
????????Shell 中輸入的命令,有一部分是 Shell 本身自帶的叫做內(nèi)置命令;有一部分是其它應用程序(一個程序就是一個命令)這叫做外部命令。Shell 本身支持的命令并不多功能也有限,但?Shell 可以調(diào)用其他程序,每個程序就是一個命令,使得 Shell 命令數(shù)量可以無限擴展,結(jié)果就是 Shell 功能非常強大,完全能夠勝任 Linux 日常管理工作,如文本或字符串檢索、文件的查找或創(chuàng)建、大規(guī)模軟件自動部署、更改系統(tǒng)設置、監(jiān)控服務器性能、發(fā)送報警郵件、抓取網(wǎng)頁內(nèi)容、壓縮文件等。更加驚訝的是,Shell 還可以讓多個外部程序發(fā)生連接,在它們之間很方便地傳遞數(shù)據(jù),就是把一個程序的輸出結(jié)果傳遞給另一個程序作為輸入。Shell 強大,并不是 Shell 本身功能豐富,而是它擅長使用和組織其他的程序??梢詫?Shell 在整個 Linux 系統(tǒng)中的地位描述成下圖所示的樣子。注意“用戶”和“其它應用程序”是通過虛線連接的,因為用戶啟動 Linux 后直接面對的是 Shell,通過 Shell 才能運行其它的應用程序。
四、Shell 編程(Shell 是一種腳本語言)
????????Shell 并不是簡單的堆砌命令,我們還可以在 Shell 中編程,這和使用?C++、C#、Java、Python?等常見的編程語言并沒有什么兩樣。Shell 雖然沒有 C++、Java、Python 等強大,但也支持了基本的編程元素,例如:
- if...else 選擇結(jié)構(gòu),case...in 開關語句,for、while、until 循環(huán);
- 變量、數(shù)組、字符串、注釋、加減乘除、邏輯運算等概念;
- 函數(shù),包括用戶自定義的函數(shù)和內(nèi)置函數(shù)(例如 printf、export、eval 等)。
????????站在這個角度講,Shell 也是一種編程語言,它的編譯器(解釋器)是 Shell 這個程序。我們平時所說的 Shell,有時候是指連接用戶和內(nèi)核的這個程序,有時候又是指 Shell 編程。Shell 主要用來開發(fā)一些實用的、自動化的小工具,而不是用來開發(fā)具有復雜業(yè)務邏輯的中大型軟件,例如檢測計算機的硬件參數(shù)、搭建 Web 運行環(huán)境、日志分析等,Shell 都非常合適。
????????尤其是 Linux 運維工程師,Shell 更是必不可少的,是必須掌握的技能,它使得我們能夠自動化地管理服務器集群,否則你就得一個一個地登錄所有的服務器,對每一臺服務器都進行相同的設置,而這些服務器可能有成百上千之多,會浪費大量的時間在重復性的工作上。
五、常見的 Shell
常見的 Shell 有 sh、bash、csh、tcsh、ash 等。
sh
????????sh 的全稱是 Bourne shell,由 AT&T 公司的 Steve Bourne開發(fā),為了紀念他,就用他的名字命名了。sh 是 UNIX 上的標準 shell,很多 UNIX 版本都配有 sh。sh 是第一個流行的 Shell。
csh
????????sh 之后另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計的,這個 shell 的語法有點類似C語言,所以才得名為 C shell ,簡稱為 csh。Bill Joy 是一個風云人物,他創(chuàng)立了 BSD 操作系統(tǒng),開發(fā)了 vi 編輯器,還是 Sun 公司的創(chuàng)始人之一。
BSD 是 UNIX 的一個重要分支,后人在此基礎上發(fā)展出了很多現(xiàn)代的操作系統(tǒng),最著名的有 FreeBSD、OpenBSD 和 NetBSD,就連?Mac OS X 在很大程度上也基于BSD。
tcsh
????????tcsh 是 csh 的增強版,加入了命令補全功能,提供了更加強大的語法支持。
ash
????????一個簡單的輕量級的 Shell,占用資源少,適合運行于低內(nèi)存環(huán)境,但是與下面講到的 bash shell 完全兼容。
bash
????????bash shell 是 Linux 的默認 shell。bash 由 GNU 組織開發(fā),保持了對 sh shell 的兼容性,是各種 Linux 發(fā)行版默認配置的 shell。
bash 兼容 sh 意味著,針對 sh 編寫的 Shell 代碼可以不加修改地在 bash 中運行。
盡管如此,bash 和 sh 還是有一些不同之處:
- 一方面,bash 擴展了一些命令和參數(shù);
- 另一方面,bash 并不完全和 sh 兼容,它們有些行為并不一致,但在大多數(shù)企業(yè)運維的情況下區(qū)別不大,特殊場景可以使用 bash 代替 sh。
六、Shell 腳本的執(zhí)行方式
腳本格式要求
1)腳本以#!/bin/bash開頭
2)腳本需要有可執(zhí)行權限
方式1(輸入腳本的絕對路徑或相對路徑)
說明:首先要賦予helloworld.sh 腳本的+x權限, 再執(zhí)行腳本
比如/hello.sh 或者使用絕對路徑/root/shcode/hello.sh
方式2(sh+腳本)
說明:不用賦予腳本+x權限,直接執(zhí)行即可。比如 shhello.sh,也可以使用絕對路徑
七、編寫第一個Shell 腳本
創(chuàng)建一個 Shell 腳本,輸出hello world!
vim hello.sh
#!/bin/bash
echo "hello,world~"
文章來源:http://www.zghlxwxcb.cn/news/detail-708653.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-708653.html
?八、參考資料:Shell腳本手冊.pdf (aliyuncs.com)
到了這里,關于Linux——Shell腳本編程(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!