当前位置:网站首页>6条shell小技巧,让脚本显得不再业余
6条shell小技巧,让脚本显得不再业余
2022-07-20 23:37:00 【架构师之路】
前同事王霄出书了,《从零开始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是工程师必知必会吗?
阅读原文,立享折扣。
边栏推荐
- Traverse the pictures of folders and subfolders, use OpenCV to change the size and save to a folder
- IT运维管理指什么?如何建立有效的IT运维管理系统?
- Junda technology - Mobus to SNMP network monitoring terminal
- JS -- loop -- guess numbers (generate random numbers with decimal math.random)
- Array tarray in ue4/5
- Time related operations commonly used in MySQL
- 【2023提前批 之 面经】~ 联发科
- XML parsing
- How to analyze and design performance test scenarios
- Path of C (33)
猜你喜欢
新鲜出炉的 yoloV5可视化实战项目(1)
SYCL学习笔记
同城两中心自适应同步模式部署
XFS opens a new way of e-commerce
C#(四十一)之线程
XML解析
Regression prediction analysis of jujube genetics based on support vector machine
XFS 打开电子商务新方式
YII框架安装步骤(yii框架版本1.1.20,时间是2018/11)
Encapsulate the global input component and bind parent-child data through V-model
随机推荐
【2023提前批 之 面经】~ 锐捷
RuntimeError: CUDA out of memory. Tried to allocate 32.00 MiB||查看GPU内存
[email protected]交互
有效防止softmax计算时上溢出(overflow)和下溢出(underflow)的方法
两地三中心部署
Ora-01461: only the long value to be inserted into the long column can be bound
【等保常见问题解答】等保测评机构能帮忙做等保整改吗?
下游任务(downstream task)含义
XML parsing
新版的动手学ROS2发布啦
Latest microservice component selection
Changes and limitations of defi to the economic model
【2023提前批 之 面经】~ 联发科
计网使用的图片
在线博客系统设计
ICML 2022 | 教程效度,可靠性和意义:可复现机器学习的统计方法教程
At the age of 30, I was laid off by the company, and some people never recovered, but I turned against the wind and was reborn~
cv demo
mysql explain执行计划分析
同城多数据中心部署 TiDB