shell 脚本规范
shell 脚本规范
一、背景
1.使用哪一种shell?
必须使用bash shell
2.什么时候使用shell?
- 数量相对较少的操作
- 脚本文件少于100行
3.脚本文件扩展名是什么?
shell脚本不要求有扩展名,或者以.sh结尾,库文件必须以.sh结尾,并且不可执行。
二、环境
STDOUT vs STDERR
所有的错误信息都应该被导向STDERR。
err() {
echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $@" >&2
}
if ! do_something; then
err "Unable to do_something"
exit "${E_DID_NOTHING}"
fi
三、注释
1.文件头注释
每一个文件的开头必须对文件进行描述
基本格式:
#!/bin/bash
# Date :
# Auth :
# E-mail:
# 功能描述
2.功能注释
任何函数及库函数无论长短都必须注释。
3.实现部分注释
注释较复杂、不易阅读、重要的部分
四、格式
1. 缩进
缩进4个空格,不允许使用制表符
2. 行的长度
每行最大长度为80个字符
3. 管道
如果一行容不下整个管道,把整个管道分割成每一行一个管道。
该规则同样适用于 || 和 &&
# Long commands
command1 \
| command2 \
| command3 \
| command4
4.循环
将 ; do , ; then 和 while , for , if 放在同一行,else单独一行。
if condition ;then
command
else
command
fi
5.case
如果命令只有一行,命令可以和;放在一行,其他情况下;单独一行。
case "${expression}" in
a)
command
;;
absolute)
command
;;
*)
command
;;
esac
6.变量
除了单个字符的特殊变量和定位变量之外,其他变量在引用时必须用{}括起来
除了特殊情况下使用$*,其他情况都必须使用$@
五、特性和BUG
1. 命令替换
使用 $(command) 而不是command
2. test,[和[[
必须使用[[
在 [[ 和 ]] 之间不会有路径名称扩展或单词分割发生,所以使用 [[ ... ]] 能够减少错误。而且 [[ ... ]] 允许正则表达式匹配,而 [ ... ] 不允许
3.测试字符串
使用 -z 或 -n 测试,不要使用 [[ "${my_var}" = "" ]]
4. eval
避免使用eval
六 命名规范
1.函数
- 函数名小写,并使用下划线分割单词
- 函数名和() 没有空格
- 大括号和函数名位于同一行
2.变量名
同函数名
3.常量和环境变量名
- 全部大写
- 下划线分割
4.源文件名
- 小写
- 需要分割使用下划线进行分割
5.只读变量
使用 readonly 或者 declare -r 来确保变量只读
6.本地变量
使用 local 声明特定功能的变量。声明和赋值应该在不同行。
7. 函数位置
所有函数放在常量下面
8.主函数,main
文件最后一行
main "$@"
七 命令调用
1.检查返回值
对于非管道命令,使用 $? 或直接通过一个 if 语句来检查以保持其简洁。
if ! mv "${file_list}" "${dest_dir}/" ; then
echo "Unable to move ${file_list} to ${dest_dir}" >&2
exit "${E_BAD_MOVE}"
fi
# Or
mv "${file_list}" "${dest_dir}/"
if [[ "$?" -ne 0 ]]; then
echo "Unable to move ${file_list} to ${dest_dir}" >&2
exit "${E_BAD_MOVE}"
fi
参考:
https://google.github.io/styleguide/shell.xml
shell 脚本规范的更多相关文章
- Shell编程-12-Shell脚本规范及调试
目录 Shell脚本规范 Shell脚本调试 Shell脚本规范 良好的代码规范不仅方便阅读,也利于维护和提升开发效率.因此建议大家在编写Shell脚本时养成良好的代码习惯.今天就和大家探讨一 ...
- 【Shell Basic】Shell脚本编写规范
shell脚本需要有较高的实用性.可维护.可阅读.方便他人阅读,因而需要建立一定的规范来操作 dream361@master:~$ cat test2.sh #!/bin/bash 所使用的bash程 ...
- 利用shell脚本生成CHANGELOG.md(包含git提交规范)
前言 我们经常看到github上面有很多CHANGELOG.MD包含版本的更新信息,如果我们的git提交能遵循一定的规范,那么使用gitlog就能很方便的生成它 生成结果  shell脚本 http ...
- Shell脚本开发规范
一.前言 由于工作需要,最近重新开始拾掇shell脚本.虽然绝大部分命令自己平时也经常使用,但是在写成脚本的时候总觉得写的很难看.而且当我在看其他人写的脚本的时候,总觉得难以阅读.毕竟shell脚本这 ...
- 【Shell脚本编程系列】Shell脚本开发的习惯和规范
1.开头指定脚本解释器 #!/bin/sh或#!/bin/bash 2.开头加版本版权信息 #Date #Author #Mail #Function #Version 提示:可配置vim编辑文件时自 ...
- 【Shell脚本编程系列】知识储备以及建立规范的脚本
前言 学习shell脚本编程需要的知识储备: vi/vim编辑器命令 vimrc设置要熟练 基础命令,100多个要熟练 基础和常用的网络服务命令要会:nfs . rsync. inotify . la ...
- Shell脚本编写规范
shell脚本需要有较高的实用性.可维护.可阅读.方便他人阅读,因而需要建立一定的规范来操作 dream361@master:~$ cat test2.sh #!/bin/bash 所使用的bash程 ...
- 编写Shell脚本的最佳实践,规范一
随着写的SHELL程序越来越多,发现自己每次写都有不同的习惯或者定义了不同的东西,变量名定义得不一样,整个程序缩进不统一,没有注释等问题,等我回过头看这些程序的时候发现很麻烦.所以写了个shell代码 ...
- 编写Shell脚本的最佳实践,规范二
需要养成的习惯如下: 代码有注释 #!/bin/bash # Written by steven # Name: mysqldump.sh # Version: v1.0 # Parameters : ...
随机推荐
- openprocess提升为测试权限
BOOL EnableDebugPrivilege() { HANDLE hToken; BOOL fOk=FALSE; if(OpenProcessToken(GetCurrentProcess() ...
- ps:消除锯齿和羽化
我们使用椭圆选框工具,分别关闭和打开消除锯齿(也称抗锯齿),创建两个差不多大的正圆形选区,然后填充黑色看看.怎样快速填充黑色还记得吗?先[X]然后[ALT DELETE].填充之后取消选择[CTRL ...
- ForkJoinPool源码简单解析
ForkJoin框架之ForkJoinTask java 阅读约 62 分钟 前言 在前面的文章"CompletableFuture和响应式编程"中提到了ForkJoinTas ...
- 2020年的ARM处理器将超越英特尔
2020年ARM真的会超越英特尔成为世界芯片霸主吗?迄今为止,基于ARM的笔记本电脑一直很流行,但在一两年内你可能会对它们产生不同的印象.该公司对其未来的处理器架构的性能预期提供了一个罕见的看法,这些 ...
- Spark在MaxCompute的运行方式
一.Spark系统概述 左侧是原生Spark的架构图,右边Spark on MaxCompute运行在阿里云自研的Cupid的平台之上,该平台可以原生支持开源社区Yarn所支持的计算框架,如Spark ...
- python网络编程之验证客户端链接的合法性
六.socket的更多方法介绍 服务端套接字函数s.bind() 绑定(主机,端口号)到套接字s.listen() 开始TCP监听s.accept() b被动接收TCP客户的连接,(阻塞式)等待连接的 ...
- [CSP-S模拟测试]:X国的军队(贪心)
题目描述 $X$国和$Y$国开战了! 作为$X$国的军事参谋,你了解到事态的严峻性.为了更好地应付敌人,你收集到了$Y$国城市中$n$个据点的信息,你打算攻破这$n$个据点! 每个据点$i$的信息由火 ...
- Centos6.5在线配置安装Java环境与Tomcat环境
书写此文一来记录环境,以便后期查看使用,Linux环境下配置centos与Java开发环境 本文环境:虚拟机系统centos6.5 链接工具:xshell脚本链接工具 一.安装Java开发 ...
- iOS打印各种类型数据
整型占位符说明 : %d : 十进制整数, 正数无符号, 负数有 “-” 符号; %o : 八进制无符号整数, 没有 0 前缀; %x : 十六进制无符号整数, 没有 0x 前缀; %u : 十进制无 ...
- php面试专题---19、MySQL高可扩展和高可用考点
php面试专题---19.MySQL高可扩展和高可用考点 一.总结 一句话总结: 要区别分区和分库分表,分区的话对用户是透明的,分库分表的话需要程序员做点事情,主从数据库同步的话借助的是二进制日志 1 ...