长文《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 分钟 大家有收获.
架构师之路 - 分享技术思路
来源: http://www.tuicool.com/articles/eIjYfaE