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/
6条shell小技巧,让脚本显得不再业余【转】的更多相关文章
- Shell 小技巧
Shell 小技巧 ${} 的使用 截断变量 去掉左边 使用 # (最短匹配)或 ## (最长匹配)方法为 ${var#<模式>} var=DUMMY echo ${var#*M} # M ...
- 日常开发中的shell小技巧
工具推荐 命令行中很方便的代码统计工具---cloc 强大的分屏工具---tmux 最舒服的markdown书写工具---typora markdown图床推荐--七牛云 模拟生成熵(避免暴力手搓键盘 ...
- shell小技巧(7)shell运行调试
可以在sh内使用set -x,使用后,会打印每条命令的输出 在shell中设置 set -x 开启 set +x 关闭 也可以在执行脚本时加参数 sh -x *.sh
- [小技巧] Python 脚本暴力破解 HC2600 机顶盒管理密码
家里最近接入了广电有线电视,配了三个创维 HC2600 机顶盒,并且每个机顶盒还带有无线路由器功能. 免费赠送 Internet 接入服务倒也没什么,不过机顶盒内置的 WIFI 实在有点寒酸:只支持 ...
- shell小技巧(6)修改一批文件后缀
当前目录下后缀为sh的文件,改为后缀shell. 这里列出两种方法,先看第一种.方法1:#!/bin/bash str=`find ./ -name \*.sh` # 会产生一个列表 file=&q ...
- 读javascript高级程序设计16-几条函数小技巧
内容概要 作用域安全的构造函数 惰性载入函数 函数绑定 函数节流 一.作用域安全的构造函数 我们知道,当使用new操作符调用构造函数时,构造函数内部的this会指向新创建对象的实例. function ...
- Shell 小技巧的问题 mysql -e ,字符串替换telnet命令检测
api_url= #echo ${api_url/:/ }a #echo `echo $api_url|sed -i 's/:/ /' ` #|sed -i 's/:/ /' ` #sed 'as/: ...
- shell小技巧
# awk '{a[$1]++;a[$2]++}END{for (i in a)print i "\t" a[i]}' list | grep -w 2 | awk '{print ...
- mysql写shell小技巧
set global general_log=on;set @file=0x653A2F2F7777772F2F782E706870;set global general_log_file=@file ...
随机推荐
- docker下安装redis集群
docker-compose.yml master: image: redis:4 container_name: redis-cluster_master command: redis-server ...
- jQuery的内部运行机制和原理
jQuery的优点: jQuery是一个非常优秀的JavaScript库,与Prototype,YUI,Mootools等众多的Js类库相比,它剑走偏锋,从Web开发实用的角度出发,抛除了其它Lib中 ...
- 排序算法的c++实现——归并排序
归并排序是典型分治思想的代表——首先把原问题分解为两个或多个子问题,然后求解子问题的解,最后使用子问题的解来构造出原问题的解. 对于归并排序,给定一个待排序的数组,首先把该数组划分为两个子数组,然后对 ...
- MySQL Table--MySQL外键
在之前的MySQL运维中,要求禁用触发器/存储过程/外键等一些数据库常见功能,因此对MySQL外键也相对比较陌生,今天特地探究下. 现有表TB001和TB002各包含6291456行数据,创建脚本如下 ...
- Jenkins实用发布与回滚PHP项目生产实践
目录 1.概述 2.项目实践 2.1.环境说明 2.2.Jenkins配置 2.2.1.修改Jenkins的运行用户 2.2.2.配置Jenkins用户和Gitlab的ssh-key 2.2.3.Je ...
- python将科学计数法表示的数值的字符串转换成数值型数据
今天碰到一个问题,需要将科学计数法表示的数值的字符串转换成数值型数据参与算术运算, 然而,当使用int()方法进行转换时,直接报错了,如下: 然后在网上找转换方法,始终没有找到合适的方法,有的是自己写 ...
- windows系统获取进程的pid号并终止
,,,* delims= " %a in ('tasklist ^| findstr "AutodeskDesktopApp.exe"') do (set commitd ...
- 遗传算法介绍并附上Python代码
之前介绍过遗传算法,参见:https://www.cnblogs.com/LoganChen/p/7509702.html 我们用Python实现同样的问题解答. y=10*sin(5*x)+7*ab ...
- vue-router有哪几种导航钩子?(具体怎么用的)
三种,第一种:是全局导航钩子:router.beforeEach(to,from,next),作用:跳转前进行判断拦截.第二种:组件内的钩子第三种:单独路由独享组件 .
- 软件工程1916|W(福州大学)_助教博客】助教总结
2018年上个学期,我担任计算机专业软件工程实践课程的助教,因为有汪老师和她的两位优秀研究生担任助教,基本上没有让我做什么事,除了参加了几次课程答辩.我对于助教需要做的事情其实还是没什么概念的.这个学 ...