很多情况下,我们会先获取当前脚本的路径,然后一这个路径为基准,去找其他的路径。通常我们是直接用pwd以期获得脚本的路径。
不过其实这样是不严谨的,pwd获得的是当前shell的执行路径,而不是当前脚本的执行路径。
正确的做法应该是下面这两种:
应当先cd进当前脚本的目录然后再pwd,或者直接读取当前脚本的所在路径;之前在编写nginx配置更新脚本的时候就遇到了这个操作姿势的坑。
代码要简短这里的简短不单单是指代码长度,而是只用到的命令数。原则上我们应当做到,能一条命令解决的问题绝不用两条命令解决。这不仅牵涉到代码的可读性,而且也关乎代码的执行效率。
最最经典的例子如下:
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