天天看點

跟老男孩學Linux運維:Shell程式設計實戰導讀

<b>前言</b>

為什麼要寫這本書

目前全球正處于網際網路+的時代,越來越多的傳統企業都在通過網際網路提供産品和服務,比如,網際網路+教育、網際網路+金融、網際網路+電商、網際網路+計程車、網際網路+保險等,可以看到,幾乎所有的産品、服務都能在網上找到。而支撐網際網路的幕後英雄其實就是linux(包括移動網際網路在内),掌握linux運維技術已經成為每一個it技術人員的必備技能!

網際網路+的時代下企業的網站流量呈爆炸式增長,如果你是運維人員,很可能要面對幾十台、幾百台、上千台甚至上萬台的伺服器裝置,而對于企業來說,如何提高it運維的管理效率、降低成本也成了最大問題。要解決這個問題,必須在linux運維工作中,做好運維服務的标準化、規範化、流程化和自動化,而這裡面的前三項其實是在為最後一項“it運維自動化”做鋪墊。

要實作it運維自動化就需要學會程式設計語言,目前linux系統下最流行的運維自動化語言就是shell和python(python相關圖書,作者正在寫作中)。在這兩者之中,shell又幾乎是所有it企業都必須使用的運維自動化程式設計語言,特别是在運維工作中的服務監控、業務快速部署、服務啟動停止、資料備份及處理、日志分析等環節裡,shell必不可少。當然python也是一門很好的自動化程式設計語言,它和shell是互補的,shell更适合系統底層,而python則更适合處理複雜的業務邏輯,以及開發複雜的運維軟體工具,實作通過web通路等。

在長期的運維工作以及深度教學中,老男孩發現很多linux入門人員很害怕shell程式設計,覺得shell不好掌握,甚至是已經工作的企業運維人員對shell程式設計也是一知半解,不能熟練運用。而市面上的shell圖書大多如出一轍,理論多,實戰少。是以在衆多學員和網友的關注和提議下,老男孩決定寫一本比較與衆不同的偏重實戰的shell程式設計書籍,相信本書一定會讓衆多讀者受益,提升個人在企業工作中的效率,達到加薪升職的目的。

本書是老男孩linux運維實戰系列的第二本書,第一本是《跟老男孩學習linux運維:web叢集實踐》(已由機械工業出版社出版),第三本是《跟老男孩學習linux運維:三劍客指令實戰》(預計書名),此書将在幾個月後和大家見面。更多linux運維實戰系列的圖書在持續寫作中,敬請期待。

讀者對象

熱衷于it運維自動化的人員

linux系統管理者和運維工程師

網際網路網站開發及資料庫管理人員

網絡管理者和項目實施工程師

linux相關售前售後技術工程師

開設linux相關課程的大中專院校

對linux及shell程式設計感興趣的人員

如何閱讀本書

本書是一本較完整的shell程式設計實戰型圖書,并非大而全,但處處可以展現實戰二字,大多内容取于企業實戰,并結合老男孩十幾年的運維工作和教學工作進行了梳理。本書從脈絡上可分為五大部分:

第一部分為shell程式設計基礎篇(第1章~第4章),着重介紹新手如何學好shell程式設計,涉及的内容包括shell程式設計的入門介紹、基礎知識、運作原理、程式設計文法、程式設計習慣、變量知識以及變量的深入實踐。讀者學完此部分,将會具備一個學好shell程式設計的堅實基礎。

第二部分為國中級的實戰知識和技能篇(第5章~第8章),着重講解變量的多種數值運算、條件測試與比較、if條件判斷語句、shell函數等相關的知識,并給出了企業實戰技巧和案例。本部分是學好shell程式設計的重中之重,讀者必須掌握。

第三部分為shell中進階實戰知識和技能篇(第9章~第13章),着重講解case條件語句、while循環和until型循環、for循環和select循環、條件與循環控制及狀态傳回值、shell數組等知識,以及相應的實戰技巧和案例。本部分同樣是學好shell程式設計的重中之重,讀者必須掌握。

第四部分為高效shell程式設計必備知識篇(第14章~第16章),着重講解shell腳本開發規範與編碼習慣、shell腳本的調試知識和技巧、shell腳本開發環境的配置調整和優化等。

第五部分為shell特殊應用及企業面試、實戰案例篇(第17章~第19章),着重講解linux信号及trap指令的企業應用實踐、expect自動化互動式程式的應用實踐,以及能展現全書所講技術的面試題和企業實戰案例,讓真正的shell全自動化運維成為可能。

最後一章補充講解了大家易感困惑的子shell知識及應用實踐内容。

勘誤和支援

由于作者所授的教育訓練課程排期很緊,課程較多,全書内容基本上都是利用早晨和夜裡的時間完成寫作的。限于作者的水準和能力,加之編寫的時間倉促,書中難免有疏漏和不當之處,懇請讀者批評指正。你可以将書中的錯誤釋出在專門為本書準備的部落格位址評論處(http://oldboy.blog.51cto.com/2561410/1865956或微網誌http://weibo.com/oldboy8)。同時不管你遇到何種問題,都可以加入我為本書提供的qq交流群204041129(驗證資訊:shell書籍),我将盡力為你提供最滿意的解答。書中所需的工具及源檔案也将釋出在的部落格網站上(書中大部分章節結尾都給出了相關網址及二維碼),我也會将相應功能的更新及時釋出出來。如果你有更多的寶貴意見,也歡迎發送郵件至郵箱[email protected],很期待能夠聽到你們的真摯回報。

緻謝

感謝猶金毅、何清等為本書貢獻第20章的重要底稿内容及對本書的寫作給予的支援。

感謝孔令飛為本書第19章貢獻有趣的girllove案例内容及對本書的寫作給予的支援。

感謝老男孩it教育的每一位在校學員,是你們自覺努力的學習,使得我有較多的時間持續寫作,特别是運維30-31期150位學員參與了本書的校稿。感謝你們對老男孩老師的支援。

感謝老男孩it教育裡每一個班級的助教、班主任、班長及班幹部,感謝你們替我分擔老男孩it教育衆多學員的答疑、輔導、批改作業及班級管理工作。

感謝我的同僚——老男孩教育python學院的alex老師、武老師,雲計算與自動化架構班的趙班長老師,linux+python高薪運維班的李泳誼、張耀等老師,以及其他未提及名字的衆多老師,正是你們辛勤努力的工作,讓我得以有時間完成此書。

一如既往地感謝中網志騰的郭威總經理和數位創天的王斐總經理及梁露女士,感謝你們提供優質的dell伺服器資源,使得本書得以高效順利地完成!

感謝森華易騰的陸錦雲女士及其同僚,感謝你們提供的優質idc機房帶寬支援,使得本書得以順利完成!

感謝機械工業出版社華章公司的編輯楊繡國,感謝你的支援、包容和鼓勵,正是你的鼓勵和幫助引導我順利完成全部書稿。

感謝沒有提及名字的所有學生、網友以及關注老男孩的每一位友人、朋友。

最後要感謝我的父母、家人,正是你們的支援和體諒,讓我有無限信心和力量去寫作,并最終完成此書!

謹以此書,獻給支援老男孩it教育的每一位朋友、學員及衆多熱愛linux運維技術的朋友。

老男孩老師

北京,2016年11月

<b>目錄</b>

前  言

第1章 如何才能學好shell程式設計  

<a href="https://yq.aliyun.com/articles/82497/" target="_blank">1.1 為什麼要學習shell程式設計  </a>

第2章 shell腳本初步入門  

<a href="https://yq.aliyun.com/articles/82520/" target="_blank">2.2 什麼是shell腳本  </a>

<a href="https://yq.aliyun.com/articles/82531" target="_blank">2.4 腳本語言的種類  </a>

<a href="https://yq.aliyun.com/articles/82531" target="_blank">2.5 常用作業系統預設的shell  </a>

第3章 shell變量的核心基礎知識與實踐  

<a href="https://yq.aliyun.com/articles/82540/" target="_blank">3.1 什麼是shell變量  </a>

<a href="https://yq.aliyun.com/articles/82554/" target="_blank">3.4 變量定義技巧總結  </a>

第4章 shell變量知識進階與實踐  / 41

4.1 shell中特殊且重要的變量  / 41

4.1.1 shell中的特殊位置參數變量  / 41

4.1.2 shell程序中的特殊狀态變量  / 47

4.2 bash shell内置變量指令  / 52

4.3 shell變量子串知識及實踐  / 55

4.3.1 shell變量子串介紹  / 55

4.3.2 shell變量子串的實踐  / 56

4.3.3 變量子串的生産場景應用案例  / 59

4.4 shell特殊擴充變量的知識與實踐  / 60

4.4.1 shell特殊擴充變量介紹  / 60

4.4.2 shell特殊擴充變量的實踐  / 61

4.4.3 shell特殊擴充變量的生産場景應用案例  / 63

第5章 變量的數值計算實踐  / 65

5.1 算術運算符  / 65

5.2 雙小括号“(())”數值運算指令  / 66

5.2.1 雙小括号“(())”數值運算的基礎文法  / 66

5.2.2 雙小括号“(())”數值運算實踐  / 66

5.3 let運算指令的用法  / 73

5.4 expr指令的用法  / 75

5.4.1 expr指令的基本用法示例  / 75

5.4.2 expr的企業級實戰案例詳解  / 76

5.5 bc指令的用法  / 81

5.6 awk實作計算  / 83

5.7 declare(同typeset)指令的用法  / 83

5.8 $[]符号的運算示例  / 83

5.9 基于shell變量輸入read指令的運算實踐  / 84

5.9.1 read指令基礎  / 84

5.9.2 以read指令讀入及傳參的綜合企業案例  / 87

第6章 shell腳本的條件測試與比較  / 92

6.1 shell腳本的條件測試  / 92

6.1.1 條件測試方法綜述  / 92

6.1.2 test條件測試的簡單文法及示例  / 93

6.1.3 [](中括号)條件測試文法及示例  / 94

6.1.4 [[]]條件測試文法及示例  / 95

6.2 檔案測試表達式  / 97

6.2.1 檔案測試表達式的用法  / 97

6.2.2 檔案測試表達式舉例  / 97

6.2.3 特殊條件測試表達式案例  / 101

6.3 字元串測試表達式  / 102

6.3.1 字元串測試操作符  / 102

6.3.2 字元串測試生産案例  / 104

6.4 整數二進制比較操作符  / 105

6.4.1 整數二進制比較操作符介紹  / 105

6.4.2 整數變量測試實踐示例  / 107

6.5 邏輯操作符  / 108

6.5.1 邏輯操作符介紹  / 108

6.5.2 邏輯操作符實踐示例  / 110

6.5.3 邏輯操作符企業案例  / 112

6.6 測試表達式test、[]、[[]]、(())的差別總結  / 120

第7章 if條件語句的知識與實踐  / 121

7.1 if條件語句  / 121

7.1.1 if條件語句的文法  / 121

7.1.2 if條件語句多種條件表達式文法  / 125

7.1.3 單分支if條件語句實踐  / 126

7.1.4 if條件語句的深入實踐  / 130

7.2 if條件語句企業案例精講  / 132

7.2.1 監控web和資料庫的企業案例  / 132

7.2.2 比較大小的經典拓展案例  / 142

7.2.3 判斷字元串是否為數字的多種思路  / 143

7.2.4 判斷字元串長度是否為0的多種思路  / 145

7.2.5 更多的生産場景實戰案例  / 145

第8章 shell函數的知識與實踐  / 151

8.1 shell函數的概念與作用介紹  / 151

8.2 shell函數的文法  / 152

8.3 shell函數的執行  / 152

8.4 shell函數的基礎實踐  / 153

8.5 利用shell函數開發企業級url檢測腳本  / 155

8.6 利用shell函數開發一鍵優化系統腳本  / 158

8.7 利用shell函數開發rsync服務啟動腳本  / 166

第9章 case條件語句的應用實踐  / 169

9.1 case條件語句的文法  / 169

9.2 case條件語句實踐  / 171

9.3 實踐:給輸出的字元串加顔色  / 176

9.3.1 給輸出的字元串加顔色的基礎知識  / 176

9.3.2 結合case語句給輸出的字元串加顔色  / 177

9.3.3 給輸出的字元串加背景顔色  / 180

9.4 case語句企業級生産案例  / 181

9.5 case條件語句的linux系統腳本範例  / 187

9.6 本章小結  / 191

第10章 while循環和until循環的應用實踐  / 192

10.1 當型和直到型循環文法  / 192

10.1.1 while循環語句  / 192

10.1.2 until循環語句  / 193

10.2 當型和直到型循環的基本範例  / 194

10.3 讓shell腳本在背景運作的知識  / 195

10.4 企業生産實戰:while循環語句實踐  / 206

10.5 while循環按行讀檔案的方式總結  / 210

10.6 企業級生産進階實戰案例  / 211

10.7 本章小結  / 215

第11章 for和select循環語句的應用實踐  / 217

11.1 for循環文法結構  / 217

11.2 for循環語句的基礎實踐  / 219

11.3 for循環語句的企業級案例  / 222

11.4 for循環語句的企業進階實戰案例  / 230

11.5 linux系統産生随機數的6種方法  / 239

11.6 select循環語句介紹及文法  / 241

11.7 select循環語句案例  / 242

第12章 循環控制及狀态傳回值的應用實踐  / 249

12.1 break、continue、exit、return的差別和對比  / 249

12.2 break、continue、exit功能執行流程圖  / 249

12.3 break、continue、exit、return指令的基礎示例  / 251

12.4 循環控制及狀态傳回值的企業級案例  / 253

第13章 shell數組的應用實踐  / 260

13.1 shell數組介紹  / 260

13.1.1 為什麼會産生shell數組  / 260

13.1.2 什麼是shell數組  / 260

13.2 shell數組的定義與增删改查  / 261

13.2.1 shell數組的定義  / 261

13.2.2 shell數組的列印及輸出  / 262

13.3 shell數組腳本開發實踐  / 265

13.4 shell數組的重要指令  / 267

13.5 shell數組相關面試題及進階實戰案例  / 268

13.6 合格運維人員必會的腳本清單  / 277

第14章 shell腳本開發規範  / 279

14.1 shell腳本基本規範  / 279

14.2 shell腳本變量命名及引用變量規範  / 281

14.3 shell函數的命名及函數定義規範  / 282

14.4 shell腳本(子產品)進階命名規範  / 283

14.5 shell腳本的代碼風格  / 283

14.5.1 代碼架構  / 283

14.5.2 縮進規範  / 284

14.6 shell腳本的變量及檔案檢查規範  / 285

第15章 shell腳本的調試  / 286

15.1 常見shell腳本錯誤範例  / 286

15.1.1 if條件語句缺少結尾關鍵字  / 286

15.1.2 循環語句缺少關鍵字  / 287

15.1.3 成對的符号落了單  / 287

15.1.4 中括号兩端沒空格  / 288

15.1.5 shell文法調試小結  / 289

15.2 shell腳本調試技巧  / 289

15.2.1 使用dos2unix指令處理在windows下開發的腳本  / 289

15.2.2 使用echo指令調試  / 290

15.2.3 使用bash指令參數調試  / 291

15.2.4 使用set指令調試部分腳本内容  / 294

15.2.5 其他調試shell腳本的工具  / 296

15.3 本章小結  / 296

第16章 shell腳本開發環境的配置和優化實踐  / 297

16.1 使用vim而不是vi編輯器  / 297

16.2 配置檔案.vimrc的重要參數介紹  / 298

16.3 讓配置檔案.vimrc生效  / 304

16.4 使用vim編輯器進行編碼測試  / 304

16.4.1 代碼自動縮進功能  / 304

16.4.2 代碼顔色高亮顯示功能說明  / 304

16.5 vim配置檔案的自動增加版權功能  / 305

16.6 vim配置檔案的代碼折疊功能  / 305

16.7 vim編輯器批量縮進及縮進調整技巧  / 305

16.8 其他vim配置檔案功能說明  / 307

16.9 vim編輯器常用操作技巧  / 307

第17章 linux信号及trap指令的企業應用實踐  / 310

17.1 信号知識  / 310

17.1.1 信号介紹  / 310

17.1.2 信号清單  / 310

17.2 使用trap控制信号  / 311

17.3 linux信号及trap指令的生産應用案例  / 313

第18章 expect自動化互動式程式應用實踐  / 317

18.1 expect介紹  / 317

18.1.1 什麼是expect  / 317

18.1.2 為什麼要使用expect  / 317

18.2 安裝expect軟體  / 318

18.3 小試牛刀:實作expect自動互動功能  / 318

18.4 expect程式自動互動的重要指令及實踐  / 319

18.4.1 spawn指令  / 320

18.4.2 expect指令  / 320

18.4.3 send指令  / 323

18.4.4 exp_continue指令  / 324

18.4.5 send_user指令  / 324

18.4.6 exit指令  / 325

18.4.7 expect常用指令總結  / 325

18.5 expect程式變量  / 326

18.5.1 普通變量  / 326

18.5.2 特殊參數變量  / 326

18.6 expect程式中的if條件語句  / 327

18.7 expect中的關鍵字  / 329

18.7.1 eof關鍵字  / 329

18.7.2 timeout關鍵字  / 329

18.8 企業生産場景下的expect案例  / 330

18.8.1 批量執行指令  / 330

18.8.2 批量發送檔案  / 332

18.8.3 批量執行shell腳本  / 334

18.8.4 自動化部署ssh密鑰認證+ansible的項目實戰  / 337

18.9 本章小節  / 339

第19章 企業shell面試題及企業運維實戰案例  / 340

19.1 企業shell面試題案例  / 340

19.1.1 面試題1:批量生成随機字元檔案名  / 340

19.1.2 面試題2:批量改名  / 341

19.1.3 面試題3:批量建立特殊要求使用者  / 342

19.1.4 面試題4:掃描網絡記憶體活主機  / 342

19.1.5 面試題5:解決dos攻擊  / 343

19.1.6 面試題6:mysql資料庫分庫備份  / 344

19.1.7 面試題7:mysql資料庫分庫分表備份  / 344

19.1.8 面試題8:篩選符合長度的單詞  / 344

19.1.9 面試題9:mysql主從複制異常監控  / 344

19.1.10 面試題10:比較整數大小  / 344

19.1.11 面試題11:菜單自動化軟體部署  / 344

19.1.12 面試題12:web及mysql服務異常監測  / 345

19.1.13 面試題13:監控memcached緩存服務  / 345

19.1.14 面試題14:開發腳本實作入侵檢測與報警  / 346

19.1.15 面試題15:開發rsync服務啟動腳本  / 349

19.1.16 面試題16:開發mysql多執行個體啟動腳本  / 349

19.1.17 面試題17:開發學生實踐抓阄腳本  / 351

19.1.18 面試題18:破解random随機數  / 353

19.1.19 面試題19:批量檢查多個網站位址是否正常  / 354

19.1.20 面試題20:單詞及字母去重排序  / 355

19.1.21 面試題21:開發腳本管理服務端lvs  / 357

19.1.22 面試題22:lvs節點健康檢查及管理腳本  / 359

19.1.23 面試題23:lvs用戶端配置腳本  / 360

19.1.24 面試題24:模拟keepalived軟體高可用  / 361

19.1.25 面試題25:編寫正(或長)方形圖形  / 362

19.1.26 面試題26:編寫等腰三角形圖形字元  / 363

19.1.27 面試題27:編寫直角梯形圖形字元  / 364

19.1.28 面試題28:51cto博文爬蟲腳本  / 365

19.1.29 面試題29:nginx負載節點狀态監測  / 366

19.2 shell經典程式案例:哄老婆和女孩的神器  / 369

19.2.1 功能簡介  / 369

19.2.2 使用方法  / 369

19.2.3 girllove工具内容模闆  / 370

19.2.4 girllove工具的shell源碼注釋  / 371

19.2.5 girllove最終結果展示  / 376

第20章 子shell及shell嵌套模式知識應用  / 377

20.1 子shell的知識及實踐說明  / 377

20.1.1 什麼是子shell  / 377

20.1.2 子shell的常見産生途徑及特點  / 378

20.2 子shell在企業應用中的“坑”  / 383

20.2.1 使用管道與while循環時遭遇的“坑”  / 383

20.2.2 解決while循環遭遇的“坑”  / 385

20.3 shell調用腳本的模式說明  / 386

20.3.1 fork模式調用腳本知識  / 386

21.3.2 exec模式調用腳本  / 386

21.3.3 source模式調用腳本  / 387

20.4 shell調用腳本的3種不同實踐方法  / 387

20.4.1 開發測試不同模式差別的shell腳本  / 387

20.4.2 對比fork模式與source模式的差別  / 390

20.4.3 對比exec模式與source模式的差別  / 391

20.5 shell調用腳本3種不同模式的應用場景  / 391

附 錄 linux重要指令彙總  / 393