凡是以Linux操作系统作为平台进行开发的人,对Linux Shell都不会陌生。顾名思义,Shell就是用户跟OS打交道的接口程序,“壳”。我在Windows和Linux平台上,都有比较长时间的开发经验。若要进行对比的话,Windows的命令行处理功能,跟Linux的Shell系统相比,简直是弱爆了。微软后来推出的PowerShell有所增强,但那是基于.Net的,有额外的依赖性,已经不是纯粹的薄壳程序了。

enter image description here

Linux的Shell有几种实现,大部分默认的都是bash软件。如果你想用更强大的实现,可以试试zsh(Oh My zsh),它与bash兼容,扩展功能更加强大。市场上的图书,绝大部分也是以bash为基准进行讲述的。

不知道有多少开发者和我类似,很早就知道shell脚本的强大功能,也能临时抱佛脚的抓来一些代码片段,跌跌撞撞的完成想要的功能,但是还是更多的把它看成运维的利器,并没有真正的花时间,专门去研究它。

前段时间因为工作需求,需要用shell完成比较复杂的功能。原本的零零碎碎的知识就不够用了,就买来一些书籍专门看。其中这本《Linux Shell脚本攻略》给我留下很好的印象。市场上讲shell脚本的书不少,甚至有砖头一样的大部头。可这本书有比较独到的地方。

它聚焦于常用。bash的知识还是很庞杂的。可能是因为历史原因,shell脚本语言的设计,坑比较多。一些设计和规定,甚至让你感觉这是二货程序猿的作品,明显缺乏严谨的思考和技术美感,像是补丁摞补丁。这本书不讲那些很少用的、犄角旮旯里面的奇淫技巧,而是根据用户使用环境,分了几大环境,对这几大环境下的常见处理任务,进行了简明扼要的讲述。Shell功能的灵活多变是出了名的,其它的你可以举一反三嘛!

开头,它说明了shell的概念和关联的变量设定、函数参数,调试操作。一下你就有了总体观念,可以入门了。接着,它对脚本里面最常用的处理命令进行了细致的讲述。Linux的命令是很多的,安装好一些工具包,系统里面有时会多达一千多个命令。这其实跟Linux/Unix的设计思想息息相关。参见《UNIX程序设计艺术》。Linux/Unix系统,推崇处理专业化、功能正交化,鼓励小程序,通过小程序的组合,来完成各种处理功能。这带来了非常重要的各种优点,比如耦合低,灵活度极高。但也带来了不少麻烦:你得学习每个命令行和常用参数,知识点会比较零散,容易遗忘。这些大量的处理命令里面,很多是“业务”相关的,只有在具体业务操作的时候才调用。而另外一些则不同,是通用、脚本相关的。甚至可以说,它们是为Shell脚本而生的,在脚本里面使用就会如虎添翼。比如文件搜索find、内容过滤查找grep、参数处理xargs,排序分割等等。

在后面,根据任务场景,本书内容分为文件处理、文本处理、网络结合、归档备份、系统监控等几大块知识区域。基本上涵盖了shell的常见工作任务。有了这些作为基础,想必更复杂一些的任务,也不在话下。当然,我个人觉得,过于复杂的任务,还是交给更专业的语言、系统好了,比如Python。限于语言设计的目标和能力,shell最好还是聚焦于常用、短小精悍的任务。而这正好是这本书所能覆盖的。大部头图书内容全面,可以用来深化知识点,但是要简单快速的学习以完成工作任务,我还是推荐这本书。