Shell脚本最佳实践
Shell脚本最佳实践
0. 编码、缩进、文件命名和权限设置等
使用utf-8编码;
统一使用tab缩进或空格缩进,不要混用;
文件名以.sh
结尾,并且统一风格;
添加可执行权限:
chmod +x [bash_script.sh]
最后,在所有输出完毕后,添加一个空行。
1. 指定默认解释器
也就是不要省略脚本第一行的shebang,一般默认是bash:
#!/bin/bash
或者更为通用一些:
#!/usr/bin/env bash
本机可用的shell解释器,可以通过以下命令查看:
cat /etc/shells
2. Shell环境设置
设置命令回显:
set -x
shell默认设置不够友好,我们希望予以加强。
# 遇到未声明的变量则报错停止
set -u
# 遇到执行错误则停止
set -e
由于set -e
对管道命令无效,管道命令其中一步失败则中止,需要使用:
set -o pipefail
我们将这三条合并,构成 bash strict mode,添加在bash脚本的开始位置:
set -euo pipefail
因为这里都是shell环境设置,所以也可以在执行脚本的时候来使用:
bash -euo pipefail [bash_sctipt.sh]
3. 条件判断。
使用 [[ ]]
并在每个变量和运算符以及和括号之间加入一个空格,例如:
if [[ $# > 1 ]] || [[ $# == 1 && $1 != 'PC' && $1 != 'server' ]]; then
echo 'Invalid commandline arguments, you should use `./run.sh` or `./run.sh PC` or `./run.sh server`'
exit 1
fi
其中,$#
用于获取命令行参数个数,$N
用于获取第N个命令行参数,参数$0
指的是脚本文件名。
相比单方括号,双方括号的优势在于可以直接使用比较运算符>``<``==``!=
等,而不是必须使用-gt``-lt``-eq``-ne
;此外双方括号可以使用&&``||
来表达与和或,而不用必须写-a``-o
这种难以记忆的写法。
4. 使用文件之前判断是否存在,并进行异常处理。
# 判断普通文件存在
if [[ ! -f 'a.txt' ]]; then
touch 'a.txt'
fi
# 判断文件夹存在
if [[ ! -d 'src' ]]; then
echo 'src dir not found'
exit 1
fi
注意cp -r
命令,在文件夹不存在时回创建文件夹并复制,而当文件夹存在时,会复制到子文件夹内。
5. 循环语句。
提倡使用for-in循环
# C风格
for (( i=0; i<10; i++)); do
// echo $i
done
# for-in
for i in $(seq 0 9); do
// echo $i
done
和 if 语句的 then 一样,for 语句的 do 也紧跟在语句后面,不单独占一行,这样显得比较紧凑。同样不要忘记加分号。
6. 总是使用main函数包裹执行体
main() {
func1()
func2()
}
main "$@"
与python类似,shell不需要函数入口,可以从第一条指令开始执行。但是为了可读性和方便调试,我们总是写一个命名为main的函数来作为全局入口。
7. 变量
1)环境变量的设置和取消:
# 设置环境变量
export SKIP_BFS=1
# 取消环境变量
unset SKIP_BFS
2)局部变量
shell变量默认全局作用域,这一点与JavaScript类似,函数内声明局部变量,应该添加local
关键字。
3)使用变量时,总是用双引号把变量包起来,例如:
# 带空格的路径
cp -r "$src_dir" "$dest_dir"
路径有空格会导致很严重的bug,用"$var"
这种写法,避免了这个问题。
8. 使用$()
而不是反引号获取表达式的值
如for-in:
# 建议使用 $(seq lb ub) 而不是 `seq lb ub` 获取范围
for i in $(seq 0 10) do
echo $i
done
9. 使用 /dev/null
过滤输出信息
[expr] > /dev/null 2>&1
命令解释:重定向到空设备,并把标准错误输出stderr也重定向为stdout。
注意,2>&1
应该总是放在命令的末尾。
10. case语句等
TBD
更多细节,参考Google Bash风格指南
Shell脚本最佳实践的更多相关文章
- MySQL安装脚本最佳实践
MySQL安装脚本最佳实践 2018年9月19日 17:01 #!/bin/bash export host_ip=192.168.7.206 echo '#1.取master主机ip的后三位 ...
- 浅谈自底向上的Shell脚本编程及效率优化
作者:沐星晨 出处:http://blog.csdn.net/sosodream/article/details/6276758 浅谈自底向上的Shell脚本编程及效率优化 小论文,大家多批评指导:) ...
- 编写Shell脚本的最佳实践
编写Shell脚本的最佳实践 http://kb.cnblogs.com/page/574767/ 需要记住的 代码有注释 #!/bin/bash # Written by steven # Name ...
- 编写Shell脚本的最佳实践,规范二
需要养成的习惯如下: 代码有注释 #!/bin/bash # Written by steven # Name: mysqldump.sh # Version: v1.0 # Parameters : ...
- 编写 Shell 脚本的最佳实践
转自:http://kb.cnblogs.com/page/574767/ 前言 由于工作需要,最近重新开始拾掇shell脚本.虽然绝大部分命令自己平时也经常使用,但是在写成脚本的时候总觉得写的很难看 ...
- 关于shell脚本编程的10个最佳实践
每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度.使 用命令的种类.看待问题的方式等等.对于那些处在shell脚本 ...
- shell脚本编程的10个最佳实践
摘要:每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.对于那些处在shell脚本编程初级阶段的程序员来说,遵循一些恰当的做法可以帮助你更快.更好的学习这些编程技巧. 每一个在U ...
- 编写Shell脚本的最佳实践,规范一
随着写的SHELL程序越来越多,发现自己每次写都有不同的习惯或者定义了不同的东西,变量名定义得不一样,整个程序缩进不统一,没有注释等问题,等我回过头看这些程序的时候发现很麻烦.所以写了个shell代码 ...
- Shell 脚本编程最佳实践
前言 由于工作需要,最近重新开始拾掇shell脚本.虽然绝大部分命令自己平时也经常使用,但是在写成脚本的时候总觉得写的很难看.而且当我在看其他人写的脚本的时候,总觉得难以阅读.毕竟shell脚本这个东 ...
随机推荐
- HTML基础和标签
HTML 1.属性 在开始标签中写的键值对 2.颜色 ①英文 ②16进制代码 例如: #cccccc #ccc (缩写) #000000 ③Rgba(0~255,255,255,0~1) 0~1代 ...
- MacOS SVN简单入门
背景:MacOS内置了SVN的客户端和服务器端的软件,下边所使用到的目录需要结合自己电脑的具体情况进行设置,并不是很困难. MacOS SVN简单入门 第一部分,创建本地的SVN测试仓库,并修改相应的 ...
- 巩固复习(Hany驿站原创)_python的礼物
Python编程语言简介 https://www.cnblogs.com/hany-postq473111315/p/12256134.html Python环境搭建及中文编码 https://www ...
- 使用 eval(input()) 的便利
输入列表或者字典时使用eval可以自动转换为其类型 2020-06-18
- 安装 kreas 2.2.4 版本问题
python 版本 3.6 不要使用 3.7 和 3.8 否则导致安装失败 tensorflow 使用 1.12.0 keras 使用 2.2.4 版本 pip install 包名 -i http: ...
- 8-Pandas之如何查找存在缺失值的行(any与all详解)
若有一份数据,简略如下: 国家 啤酒消耗量 烈酒消耗量 红酒消耗量 总酒精消耗量 所在大洲 0 Afghanistan 0.0 0.0 0.0 0.0 AS 1 Albania 89.0 132. ...
- Vue Router详细教程
1.什么是路由 1.1路由简介 说起路由你想起了什么?路由是一个网络工程里面的术语. 路由(routing)就是通过互联的网络把信息从源地址传输到目的地址的活动. --- 维基百科 额,啥玩意? 没听 ...
- react ts redux-saga | 谷歌Chrome浏览器风格的标签组件 | 中台
谷歌Chrome浏览器风格的标签组件 选用技术 react typescript redux-saga存储本地标签数据 umi 实现 [x] 支持全部关闭,当前关闭,关闭其他Tab [x] 支持Tab ...
- three.js 着色器材质基础(一)
说起three.js,着色器材质总是绕不过的话题,今天郭先生就说一说什么是着色器材质.着色器材质是很需要灵感和数学知识的,可以用简短的代码和绘制出十分丰富的图像,可以说着色器材质是脱离three.js ...
- Serverless无服务器架构详解
本文对Serverless架构的基础概念.具体产品.应用场景.工作原理进行详细解析. 基础概念 Serverless: 无服务器架构,即在无需管理服务器等底层资源的情况下完成应用的开发和运行,是云原生 ...