如何入門 Bash 編程
了解如何在 Bash 中編寫定制程序以自動(dòng)執(zhí)行重復(fù)性操作任務(wù)。
Unix 最初的希望之一是,讓計(jì)算機(jī)的日常用戶能夠微調(diào)其計(jì)算機(jī),以適應(yīng)其獨(dú)特的工作風(fēng)格。幾十年來,人們對計(jì)算機(jī)定制的期望已經(jīng)降低,許多用戶認(rèn)為他們的應(yīng)用程序和網(wǎng)站的集合就是他們的 “定制環(huán)境”。原因之一是許多操作系統(tǒng)的組件未不開源,普通用戶無法使用其源代碼。
但是對于 Linux 用戶而言,定制程序是可以實(shí)現(xiàn)的,因?yàn)檎麄€(gè)系統(tǒng)都圍繞著可通過終端使用的命令啦進(jìn)行的。終端不僅是用于快速命令或深入排除故障的界面;也是一個(gè)腳本環(huán)境,可以通過為你處理日常任務(wù)來減少你的工作量。
如何學(xué)習(xí)編程
如果你以前從未進(jìn)行過任何編程,可能面臨考慮兩個(gè)不同的挑戰(zhàn):一個(gè)是了解怎樣編寫代碼,另一個(gè)是了解要編寫什么代碼。你可以學(xué)習(xí) 語法,但是如果你不知道 語言 中有哪些可用的關(guān)鍵字,你將無法繼續(xù)。在實(shí)踐中,要同時(shí)開始學(xué)習(xí)這兩個(gè)概念,是因?yàn)槿绻麤]有關(guān)鍵字的堆砌就無法學(xué)習(xí)語法,因此,最初你要使用基本命令和基本編程結(jié)構(gòu)來編寫簡單的任務(wù)。一旦熟悉了基礎(chǔ)知識,就可以探索更多編程語言的內(nèi)容,從而使你的程序能夠做越來越重要的事情。
在 ??Bash?? 中,你使用的大多數(shù) 關(guān)鍵字 是 Linux 命令。 語法 就是 Bash。如果你已經(jīng)頻繁地使用過了 Bash,則向 Bash 編程的過渡相對容易。但是,如果你不曾使用過 Bash,你會(huì)很高興地了解到它是一種為清晰和簡單而構(gòu)建的簡單語言。
交互設(shè)計(jì)
有時(shí),學(xué)習(xí)編程時(shí)最難搞清楚的事情就是計(jì)算機(jī)可以為你做些什么。顯然,如果一臺計(jì)算機(jī)可以自己完成你要做的所有操作,那么你就不必再碰計(jì)算機(jī)了。但是現(xiàn)實(shí)是,人類很重要。找到你的計(jì)算機(jī)可以幫助你的事情的關(guān)鍵是注意到你一周內(nèi)需要重復(fù)執(zhí)行的任務(wù)。計(jì)算機(jī)特別擅長于重復(fù)的任務(wù)。
但是,為了能告知計(jì)算機(jī)為你做某事,你必須知道怎么做。這就是 Bash 擅長的領(lǐng)域:交互式編程。在終端中執(zhí)行一個(gè)動(dòng)作時(shí),你也在學(xué)習(xí)如何編寫腳本。
例如,我曾經(jīng)負(fù)責(zé)將大量 PDF 書籍轉(zhuǎn)換為低墨和友好打印的版本。一種方法是在 PDF 編輯器中打開 PDF,從數(shù)百張圖像(頁面背景和紋理都算作圖像)中選擇每張圖像,刪除它們,然后將其保存到新的 PDF中。僅僅是一本書,這樣就需要半天時(shí)間。
我的第一個(gè)想法是學(xué)習(xí)如何編寫 PDF 編輯器腳本,但是經(jīng)過數(shù)天的研究,我找不到可以編寫編輯 PDF 應(yīng)用程序的腳本(除了非常丑陋的鼠標(biāo)自動(dòng)化技巧)。因此,我將注意力轉(zhuǎn)向了從終端內(nèi)找出完成任務(wù)的方法。這讓我有了幾個(gè)新發(fā)現(xiàn),包括 GhostScript,它是 PostScript 的開源版本(PDF 基于的打印機(jī)語言)。通過使用 GhostScript 處理了幾天的任務(wù),我確認(rèn)這是解決我的問題的方法。
編寫基本的腳本來運(yùn)行命令,只不過是復(fù)制我用來從 PDF 中刪除圖像的命令和選項(xiàng),并將其粘貼到文本文件中而已。將這個(gè)文件作為腳本運(yùn)行,大概也會(huì)產(chǎn)生同樣的結(jié)果。
向 Bash 腳本傳參數(shù)
在終端中運(yùn)行命令與在 Shell 腳本中運(yùn)行命令之間的區(qū)別在于前者是交互式的。在終端中,你可以隨時(shí)進(jìn)行調(diào)整。例如,如果我剛剛處理 ??example_1.pdf?
? 并準(zhǔn)備處理下一個(gè)文檔,以適應(yīng)我的命令,則只需要更改文件名即可。
Shell 腳本不是交互式的。實(shí)際上,Shell 腳本 存在的唯一原因是讓你不必親自參與。這就是為什么命令(以及運(yùn)行它們的 Shell 腳本)會(huì)接受參數(shù)的原因。
在 Shell 腳本中,有一些預(yù)定義的可以反映腳本啟動(dòng)方式的變量。初始變量是 ??$0?
??,它代表了啟動(dòng)腳本的命令。下一個(gè)變量是 ??$1?
?? ,它表示傳遞給 Shell 腳本的第一個(gè) “參數(shù)”。例如,在命令 ??echo hello?
?? 中,命令 ??echo?
?? 為 ??$0,?
??,關(guān)鍵字 ??hello?
?? 為 ??$1?
??,而 ??world?
?? 是 ??$2?
?。
在 Shell 中交互如下所示:
$ echo hello world
hello world
在非交互式 Shell 腳本中,你 可以 以非常直觀的方式執(zhí)行相同的操作。將此文本輸入文本文件并將其另存為 ??hello.sh?
?:
echo hello world
執(zhí)行這個(gè)腳本:
$ bash hello.sh
hello world
同樣可以,但是并沒有利用腳本可以接受輸入這一優(yōu)勢。將 ??hello.sh?
? 更改為:
echo $1
用引號將兩個(gè)參數(shù)組合在一起來運(yùn)行腳本:
$ bash hello.sh "hello bash"
hello bash
對于我的 PDF 瘦身項(xiàng)目,我真的需要這種非交互性,因?yàn)槊總€(gè) PDF 都花了幾分鐘來壓縮。但是通過創(chuàng)建一個(gè)接受我的輸入的腳本,我可以一次將幾個(gè) PDF 文件全部提交給腳本。該腳本按順序處理了每個(gè)文件,這可能需要半小時(shí)或稍長一點(diǎn)時(shí)間,但是我可以用半小時(shí)來完成其他任務(wù)。
流程控制
創(chuàng)建 Bash 腳本是完全可以接受的,從本質(zhì)上講,這些腳本是你開始實(shí)現(xiàn)需要重復(fù)執(zhí)行任務(wù)的準(zhǔn)確過程的副本。但是,可以通過控制信息流的方式來使腳本更強(qiáng)大。管理腳本對數(shù)據(jù)響應(yīng)的常用方法是:
- ?
?if?
??/??then?
? 選擇結(jié)構(gòu)語句 - ?
?for?
? 循環(huán)結(jié)構(gòu)語句 - ?
?while?
? 循環(huán)結(jié)構(gòu)語句 - ?
?case?
? 語句
計(jì)算機(jī)不是智能的,但是它們擅長比較和分析數(shù)據(jù)。如果你在腳本中構(gòu)建一些數(shù)據(jù)分析,則腳本會(huì)變得更加智能。例如,基本的 ??hello.sh?
? 腳本運(yùn)行后不管有沒有內(nèi)容都會(huì)顯示:
$ bash hello.sh foo
foo
$ bash hello.sh
$
如果在沒有接收輸入的情況下提供幫助消息,將會(huì)更加容易使用。如下是一個(gè) ??if?
??/??then?
?? 語句,如果你以一種基本的方式使用 Bash,則你可能不知道 Bash 中存在這樣的語句。但是編程的一部分是學(xué)習(xí)語言,通過一些研究,你將了解 ??if/then?
? 語句:
if [ "$1" = "" ]; then
echo "syntax: $0 WORD"
echo "If you provide more than one word, enclose them in quotes."
else
echo "$1"
fi
運(yùn)行新版本的 ??hello.sh?
? 輸出如下:
$ bash hello.sh
syntax: hello.sh WORD
If you provide more than one word, enclose them in quotes.
$ bash hello.sh "hello world"
hello world
利用腳本工作
無論你是從 PDF 文件中查找要?jiǎng)h除的圖像,還是要管理混亂的下載文件夾,抑或要?jiǎng)?chuàng)建和提供 Kubernetes 鏡像,學(xué)習(xí)編寫 Bash 腳本都需要先使用 Bash,然后學(xué)習(xí)如何將這些腳本從僅僅是一個(gè)命令列表變成響應(yīng)輸入的東西。通常這是一個(gè)發(fā)現(xiàn)的過程:你一定會(huì)找到新的 Linux 命令來執(zhí)行你從未想象過可以通過文本命令執(zhí)行的任務(wù),你會(huì)發(fā)現(xiàn) Bash 的新功能,使你的腳本可以適應(yīng)所有你希望它們運(yùn)行的不同方式。
學(xué)習(xí)這些技巧的一種方法是閱讀其他人的腳本。了解人們?nèi)绾卧谄湎到y(tǒng)上自動(dòng)化死板的命令??纯茨闶煜さ模ふ夷切┠吧挛锏母嘈畔?。
另一種方法是下載我們的 ??Bash 編程入門??? 電子書。它向你介紹了特定于 Bash 的編程概念,并且通過學(xué)習(xí)的構(gòu)造,你可以開始構(gòu)建自己的命令。當(dāng)然,它是免費(fèi)的,并根據(jù) ??創(chuàng)作共用許可證?? 進(jìn)行下載和分發(fā)授權(quán),所以今天就來獲取它吧。