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/

原文地址:https://www.cnblogs.com/paul8339/p/11693259.html

时间: 2024-10-10 09:55:33

6条shell小技巧,让脚本显得不再业余【转】的相关文章

mysql写Shell小技巧

今天终于在表哥的帮助下解决了文件导入/出这个问题了.(很菜逼的一个问题),然后将最近看到的文章都自己测试了下,顺便奉上记录.1.Mysql数据库支持union的时候写文件小技巧: 采用常规的union写入,可以看到前面的字段占位数肯定也会被写入,替换成null也是一样的结果,这个对于写shell没啥大碍,但是如果用来写bat,mof,vbs等文件就会出问题了,那么怎么去掉这个只写入我们需要的内容呢?采用hex编码就好了. 将我们要写入的内容使用hex编码在分段写在每个字段位上,这样就可以只写入我

shell 小技巧之修改后缀及grep

批量修改文件后缀 第一种: #!/bin/bash for fn in *.$1 do mv $fn ${fn%$1}$2 done 第二种: find . -name "*.txt" | awk -F'[./]+' '{print $2}' | xargs -i -t mv {}.txt {}.sh GREP 用户小技巧 文件如下: # cat test.txt  This is a test file a good day and no coludy Sit here and si

shell小技巧--带颜色的输出

shell作为一种脚本语言是每个Linux管理员必须要掌握的技能,有时可以为shell中的输出添加一些背景颜色,使得脚本整体上略带美观,下面我们利用echo来输出一段字符串,默认情况下,echo显示的字符串都是白色的 我们可以增加一些颜色 那么是怎么实现的呢?下面给出原脚本代码 可能看到那么多数字有点懵,给出具体格式就好了 "\033[前置字符颜色:背景颜色 XXXX\033[0m"              后面没有]了 最后的[0m 代表恢复原始颜色,如果不加上的话,就会是这样的效

shell小技巧--用“$$”和&quot;$0&quot;防止同一个脚本启动多次

在编写shell脚本通过crontab定时任务启动时,如果shell脚本执行时间超过了,crontab拉起脚本的时间间隔,这个时候可能就会出现同一个脚本同时启动多次的现象.这个时候可能会导致采集的数据有重复,计算不准确等等问题,在这种有明显先和顺序要求的时候,就会出问题. 需要采取一定手段,防止这种现象.刚好可以用"$$"和"$0",来实现这个需求,实现只有等当前脚本执行完成之后,才能启动第二次执行.好了,废话不多说,直接贴一个demo,只要稍加改动,就可以套用到自

[小技巧] Python 脚本暴力破解 HC2600 机顶盒管理密码

家里最近接入了广电有线电视,配了三个创维 HC2600 机顶盒,并且每个机顶盒还带有无线路由器功能. 免费赠送 Internet 接入服务倒也没什么,不过机顶盒内置的 WIFI 实在有点寒酸:只支持 2.4 GHz 频段下 802.11n 150 Mbps 速率的传输.2.4 GHz 频段本来就很拥挤,用户体验并不好,要是和支持 802.11 ac 的双频无线路由器混用的话,恐怕反而会因为干扰起到反作用. 然而要对 HC2600 机顶盒作任何配置修改,都需要管理员密码.网上搜索到 HC2600

日常开发中的shell小技巧

工具推荐 命令行中很方便的代码统计工具---cloc 模拟生成熵(避免暴力手搓键盘) sudo rngd -r /dev/urandom -o /dev/random -f 自动输密码的脚本,基于expect #!/usr/bin/expect set password "butub" set files [glob -nocomplain -- ./*.deb] puts "[llength $files]" for {set i 0} {$i<[lleng

shell小技巧

# awk '{a[$1]++;a[$2]++}END{for (i in a)print i "\t" a[i]}' list | grep -w 2 | awk '{print $1}' > double.list # grep -f double.list list10.145.137.125 10.145.137.130 18110.145.137.130 10.145.137.125 159100.104.0.46 100.104.0.54 12210.151.132.

shell小技巧速记

1.读取文件中的内容到数组中. while read buf do tArray[$c]=$buf c=$(expr $c + 1) done < aa.txt #文件名是aa.txt for ((i=0;i<$c;i++)) do echo ${tArray[$i]} done

读javascript高级程序设计16-几条函数小技巧

内容概要 作用域安全的构造函数 惰性载入函数 函数绑定 函数节流 一.作用域安全的构造函数 我们知道,当使用new操作符调用构造函数时,构造函数内部的this会指向新创建对象的实例. function Person(name){ this.name=name; } var p=new Person('peter'); console.log(p.name);//结果:perter 但是,如果没有使用new操作符,而是将构造函数当作普通函数调用时,this会指向window对象. var p1=P