6条shell小技巧,让脚本显得不再业余

6条shell小技巧,让脚本显得不再业余

 

原创作者: 58沈剑 来自公众号:架构师之路  

 

画外音:说实话,技术思路类文章(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分钟大家有收获。

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

相关推荐:

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

 

调研,写脚本时:

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

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

(3)是用echo调试么?

Linux Shell高级技巧实战总结 一、将输入信息转换为大写字符后再进行件判断 二、为调试信息设置输出级别 三、判断参数是否为数字 四、判断整数变量的奇偶性 五、将Shell命令赋值给指定变量,以保证脚本的移植性 六、获取当前时间距纪元时间(1970年1月1日)所经过的天数 七、非直接引用变量 八、在循环中使用管道的技巧 九、自链接脚本 十、Here文档的使用技巧 十一、获取进程的运行时长(单位: 分钟) 十二、模拟简单的top命令 十三、格式化输出指定用户的当前运行进程 十四、用脚本完成which命令的基本功能 十五、验证输入信息是否合法 十六、整数验证 十七、判断指定的年份是否为闰年 十八、将单列显示转换为多列显示 十九、将文件的输出格式化为指定的宽度 二十、监控指定目录下磁盘使用空间过大的用户 二十一、编写一个更具可读性的df命令输出脚本 二十二、编写一个用于添加新用户的脚本 二十三、kill指定用户或指定终端的用户进程 二十四、判断用户输入(是/否)的便捷方法 二十五、通过FTP下载指定的文件 二十六、文件锁定 二十七、用小文件覆盖整个磁盘 二十八、统计当前系统中不同运行状态的进程数量 二十九、浮点数验证 三十、统计英文文章中每个单词出现的频率 Linux Shell经典实例解析--Oracle启动脚本(上) Linux Shell经典实例解析--Oracle启动脚本(下)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值