Shell脚本书写规范 (3)

很多情况下,我们会先获取当前脚本的路径,然后一这个路径为基准,去找其他的路径。通常我们是直接用pwd以期获得脚本的路径。
不过其实这样是不严谨的,pwd获得的是当前shell的执行路径,而不是当前脚本的执行路径。
正确的做法应该是下面这两种:

script_dir=$(cd $(dirname $0) && pwd) script_dir=$(dirname $(readlink -f $0 ))

应当先cd进当前脚本的目录然后再pwd,或者直接读取当前脚本的所在路径;之前在编写nginx配置更新脚本的时候就遇到了这个操作姿势的坑。

代码要简短

这里的简短不单单是指代码长度,而是只用到的命令数。原则上我们应当做到,能一条命令解决的问题绝不用两条命令解决。这不仅牵涉到代码的可读性,而且也关乎代码的执行效率。
最最经典的例子如下:

cat /etc/passwd | grep root grep root /etc/passwd

cat命令最为人不齿的用法就是这样,用的没有任何意义,明明一条命令可以解决,他非得加根管道;并且在处理大文件的时候第一种方式的效率会比较低。

使用新写法

这里的新写法不是指有多厉害,而是指我们可能更希望使用较新引入的一些语法,更多是偏向代码风格的,比如

尽量使用func(){}来定义函数,而不是func{}

尽量使用[[]]来代替[]

尽量使用$()将命令的结果赋给变量,而不是反引号

在复杂的场景下尽量使用printf代替echo进行回显

事实上,这些新写法很多功能都比旧的写法要强大,用的时候就知道了。

其他小tip

考虑到还有很多零碎的点,就不一一展开了,这里简单提一提。

路径尽量保持绝对路径,绝多路径不容易出错,如果非要用相对路径,最好用./修饰

优先使用bash的变量替换代替awk sed,这样更加简短

简单的if尽量使用&&和||,写成单行。比如[[ x > 2]] && echo x

当export变量时,尽量加上子脚本的namespace,保证变量不冲突

会使用trap捕获信号,并在接受到终止信号时执行一些收尾工作

使用mktemp生成临时文件或文件夹

利用/dev/null过滤不友好的输出信息

会利用命令的返回值判断命令的执行情况

使用文件前要判断文件是否存在,否则做好异常处理

不要处理ls后的数据(比如ls -l | awk \'{ print $8 }\'),ls的结果非常不确定,并且平台有关

读取文件时不要使用for loop而要使用while read

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxdxg.html