天天看点

跟老男孩学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