长文《memcache核心技术点》阅读较低,重启1分钟系列,快消时代,碎片时间可能大家更喜欢短文,更喜欢技术实践类文章吧。
画外音:说实话,技术思路类文章(WHY, HOW),比技术实践类(WHAT)更难写。
如何能让自己的shell显得不那么业余?下面6点实践一定有用。
画外音:本篇文章源自Google的一篇实践,抽取了部分1分钟能读完的内容,加入了一些分析。
一、以下面的语句开场
set -o nounset
在预设情况下,遇到不存在的变数,会忽略并继续执行,而这往往不符合预期,加入该选项,可以避免恶果扩大,终止指令码的执行。
画外音:有些变数名的手误,会让人崩溃的除错半天,通过这个方式,这类手误秒发现。
set -o errexit
在预设情况下,遇到执行出错,会跳过并继续执行,而这往往不符合预期,加入该选项,可以避免恶果扩大,终止指令码的执行。
画外音:有些Linux命令,例如rm的-f引数可以强制忽略错误,此时指令码便无法捕捉到errexit,这样的引数在脚本里是不推荐使用的。
这两个选项,都符合fail fast设计理念。
二、封装函式有必要
别光顾著一溜往下写,封装可以提高复用。

如上例:
log
简单封装,能够省去很多
[$(date +%Y/%m/%d\\ %H:%M:%S)]
的重复程式码。
画外音:这个log有点意思,学到了吗?
同时,封装还能提高程式码的可读性。

如上例:
ExtractBashComments
比
egrep "^#"
的可读性就高很多。
画外音:有些抬杠的朋友会说,不认识英文。
三、使用readonly和local修饰变数

readonly
顾名思义,只读。
local
函式内变数。
别图省事,提高安全性的同时,能避免很多让人崩溃的莫名其妙的错误。指令码写得专不专业,往往不是什么高深的点,从基本功绝逼能体现。
画外音:据说,一个C++程序员到什么水平,从ta程式码里const的使用频度,能够看出来。
四、使用$代替`(反单引号)
为什么?看了上面的例子你就懂了:
(1)$能够支援内嵌;
(2)$不用转义;
(3)有些字型,`(反单引号)和’(单引号)很像,容易把人搞晕;
五、使用代替
用单中括号:
用双中括号:
看出差别了么?更符合人性编码:
(1)避免转义问题;
(2)有不少新功能;
新功能包含但不限于:
|| :逻辑or
&& :逻辑and
== :万用字元(globbing)字串比较
=~ :正则表示式(regular expression, RegEx)字串比较

需要注意的是,从bash3.2开始,万用字元和正则表示式都不能用引号包裹了(所以,上面的例子,加了引号就是字面比较)。
所以如果表示式里有空格,必须储存到一个变数里,再进行万用字元与正则的比较。
六、echo不是唯一的除错方法
可以用-n对指令码进行语法检查。
可以用-v跟踪脚本里的每个命令的执行。
可以用-x跟踪脚本里的每个命令的执行,并附加扩充资讯。
当然,也可以在脚本里,新增
set -o verbose
set -o xtrace
来永久指定输出除错资讯。
画外音:多在自己在机器上试一下就明白了。
希望这1分钟大家有收获。
调研,写指令码时:
(1)有因为手误,把自己逼疯过么?
(2)有因为转义,把自己搞晕过么?
(3)是用echo除错么?





























