6条shell小技巧,让脚本显得不再业余【转】
如何能让自己的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
来永久指定输出调试信息。
转自
6条shell小技巧,让脚本显得不再业余(1分钟系列) https://www.toutiao.com/i6731506941442392590/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2018-10-17 MySQL报错InnoDB: A long semaphore wait【转】
2018-10-17 10分钟搭建Kubernetes容器集群平台【转】
2018-10-17 解决MySQL报错ERROR 2002 (HY000)【转】
2018-10-17 MySQL主从1205报错【转】
2017-10-17 MySQL 5.7.17 Group Relication(组复制)搭建手册【转】