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

开发 开发工具
如何能让自己的shell显得不那么业余?下面6点实践一定有用。本篇文章源自Google的一篇实践,抽取了部分1分钟能读完的内容,加入了一些分析。

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

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

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

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

一、以下面的语句开场

(1) set -o nounset

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

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

(2) set -o errexit

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

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

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

二、封装函数有必要

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

如上例:

  1. log() 

简单封装,能够省去很多

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

的重复代码。

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

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

如上例:

  1. ExtractBashComments 

  1. egrep "^#" 

的可读性就高很多。

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

三、使用readonly和local修饰变量

  • readonly:顾名思义,只读。
  • local:函数内变量。

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

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

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

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

  • $()能够支持内嵌;
  • $()不用转义;
  • 有些字体,`(反单引号)和’(单引号)很像,容易把人搞晕;

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

用单中括号:

用双中括号:

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

  • 避免转义问题;
  • 有不少新功能;

新功能包含但不限于:

  • || :逻辑or
  • && :逻辑and
  • < :字符串比较(不需要转义)
  • == :通配符(globbing)字符串比较
  • =~ :正则表达式(regular expression, RegEx)字符串比较

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

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

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

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

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

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

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

  1. set -o verbose 
  2. set -o xtrace 

 

来***指定输出调试信息。

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

 

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

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2014-04-22 09:42:12

Bash脚本教程

2021-10-26 14:35:10

架构

2019-12-23 16:42:44

JavaScript前端开发

2015-11-23 17:34:33

秒借

2018-03-12 21:31:24

区块链

2020-11-23 16:23:59

CSS设计技术

2017-07-06 08:12:02

索引查询SQL

2017-12-20 09:42:39

PythonNginx日志

2019-07-26 06:16:37

MySQLSQLexplain

2018-04-24 14:52:48

LinuxBash脚本

2017-03-16 08:46:57

延时消息环形队列数据结构

2019-07-24 07:05:51

CPU进程ID端口

2017-09-27 11:00:50

LinuxBash使用技巧

2018-03-23 11:56:09

相似性推荐推荐算法推荐

2018-03-12 14:37:50

区块链比特币架构

2017-06-07 18:40:33

PromiseJavascript前端

2009-11-05 10:56:31

WCF通讯

2019-08-01 14:35:19

Bash脚本技巧

2023-09-29 18:36:57

IDEA编程IDE

2019-08-07 07:04:54

内存缓存数据库KV
点赞
收藏

51CTO技术栈公众号