前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >6条shell小技巧,让脚本显得不再业余

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

作者头像
架构师之路
发布2022-07-20 23:15:14
6440
发布2022-07-20 23:15:14
举报
文章被收录于专栏:架构师之路架构师之路

前同事王霄出书了,《从零开始Linux运维实践》,让他给我寄了一本。

看完书,我说,你这个书不“高大上”呀,讲Linux,讲命令工具集,讲vim,讲shell编程,讲awk实践... 想大卖,不得整点高科技新名词吗?

王霄说,高科技新名词咱也懂的不多,吓唬不住别人,反而把自己整得心慌,不如整点实在的,让爱学习的技术人有几点收获也行...

以下是我从王霄身上学到的6点实践(听王霄说,他也是和Google学的),这,也是他新书的风格。

画外音:新书上架,文末打折,欢迎捧场。

如何能让自己的shell显得不那么业余?

分享6点实践。

一、以下面的语句开场

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

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

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

前同事王霄新书,学Linux,学shell,学awk,学vim,学运维工具集... 没有那么多“高大上”的名词,只有干货知识点...

扫码购书,立享折扣

调研

你认为Linux,shell,awk,vim是工程师必知必会吗?

阅读原文,立享折扣。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档