26

6条shell小技巧,让脚本显得不再业余(1分钟系列)

 4 years ago
source link: https://www.tuicool.com/articles/eIjYfaE
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

长文《memcache核心技术点》阅读较低, 重启1分钟系列 ,快消时代,碎片时间可能大家更喜欢短文,更喜欢技术实践类文章吧。

画外音:说实话,技术思路类文章(WHY, HOW),比技术实践类(WHAT)更难写。

如何能让自己的shell显得不那么业余? 下面 6点实践 一定有用。

画外音:本篇文章源自Google的一篇实践,抽取了部分1分钟能读完的内容,加入了一些分析。

一、以下面的语句开场

yyYVniM.png!web

set -o nounset

在默认情况下,遇到不存在的变量,会忽略并继续执行,而这往往不符合预期,加入该选项,可以避免恶果扩大,终止脚本的执行。

画外音:有些变量名的手误,会让人崩溃的调试半天,通过这个方式,这类手误秒发现。

set -o errexit

在默认情况下,遇到执行出错,会跳过并继续执行,而这往往不符合预期,加入该选项,可以避免恶果扩大,终止脚本的执行。

画外音:有些Linux命令,例如rm的-f参数可以强制忽略错误,此时脚本便无法捕捉到errexit,这样的参数在脚本里是不推荐使用的。

这两个选项,都符合 fail fast 设计理念。

二、封装函数有必要

别光顾着一溜往下写,封装可以提高复用。

67B3Q3N.png!web

如上例:

log()

简单封装,能够省去很多

[$(date +%Y/%m/%d\ %H:%M:%S)]

的重复代码。

画外音:这个log()有点意思,学到了吗?

同时,封装还能提高代码的可读性。

BFzum2Z.png!web

如上例:

ExtractBashComments

egrep "^#"

的可读性就高很多。

画外音:有些抬杠的朋友会说,不认识英文。

三、使用readonly和local修饰变量

MVf2Mzm.png!web

readonly

顾名思义,只读。

local

函数内变量。

别图省事,提高安全性的同时,能避免很多让人崩溃的莫名其妙的错误。脚本写得专不专业,往往不是什么高深的点,从基本功绝逼能体现。

画外音:据说,一个C++程序员到什么水平,从ta代码里const的使用频度,能够看出来。

四、使用$()代替`(反单引号)

J7jIFvJ.png!web

为什么? 看了上面的例子你就懂了:

(1)$()能够支持内嵌;

(2)$()不用转义;

(3)有些字体,`(反单引号)和’(单引号)很像,容易把人搞晕;

五、使用[[]]代替[]

用单中括号:

yyIfEvB.png!web

用双中括号:

VFJjUvR.png!web

看出差别了么? [[]]更符合人性编码:

(1)避免转义问题;

(2)有不少新功能;

新功能包含但不限于:

|| :逻辑or

&& :逻辑and

< :字符串比较(不需要转义)

== : 通配符 (globbing) 字符串比较

=~ : 正则表达式 (regular expression, RegEx) 字符串比较

VvuQNzq.png!web

需要注意的是,从bash3.2开始,通配符和正则表达式都不能用引号包裹了(所以,上面的例子,加了引号就是字面比较)。

aMJVVny.png!web

所以如果表达式里有空格,必须存储到一个变量里,再进行通配符与正则的比较。

六、echo不是唯一的调试方法

7BbQVnF.png!web

可以用-n对脚本进行语法检查。

faYVjuj.png!web

可以用-v跟踪脚本里的每个命令的执行。

yyARbef.png!web

可以用-x跟踪脚本里的每个命令的执行,并附加扩充信息。

当然,也可以在脚本里,添加

set -o verbose

set -o xtrace

来永久指定输出调试信息。

画外音:多在自己在机器上试一下就明白了。

希望这 1分钟 大家有收获。

r6NBFbA.jpg!web

架构师之路-分享技术思路

相关推荐:

写一个cache,要掌握哪些技术点

调研,写脚本时:

(1)有因为手误,把自己逼疯过么?

(2)有因为转义,把自己搞晕过么?

(3)是用echo调试么?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK