原文链接
英文原文:https://google.github.io/styleguide/shellguide.html
中文原文:https://zh-google-styleguide.readthedocs.io/en/latest/google-shell-styleguide/

手抄笔记用于后续查阅。


文件拓展名

❕Tip
可执行文件应该没有扩展名(强烈建议)或者使用.sh扩展名。库文件必须使用.sh作为扩展名,而且应该是不可执行的

平时脚本建议 chmod u+x script_name 给脚本添加执行权限,不用添加扩展名(Linux外编辑器可添加,如notepad++编辑保存为.sh扩展名文件可以帮助检查语法错误)


注释

文件头

❕Tip
每个文件的开头是其文件内容的描述。

每个文件必须包含一个顶层注释,对其内容进行简要概述。版权声明和作者信息是可选的

例如

#!/bin/bash
#
# 程序启动脚本

功能注释

❕Tip
任何不是既明显又短的函数都必须被注释。任何函数无论其长短和复杂性都必须被注释。

所有的函数注释应该包含:

  • 函数的描述
  • 全局变量的使用和修改
  • 使用的参数说明
  • 返回值,而不是上一条命令运行后默认的推出状态

例如

#!/bin/bash
#
# 启动程序脚本APP_NAME="Cluster_1"###########################
# 程序启动函数
# 全局变量:
#   APP_NAME:应用名称
# 参数:
#   无
# 返回值:
#   无
###########################
start(){# TODO
}

实现部分的注释

❕Tip
注释你代码中含有技巧、不明显、有趣的或者重要的部分。

针对某行复杂命令平时可以进行单行注释。

TODO注释

❕Tip
使用TODO注释临时的、短期解决方案的、或者足够好但不够完美的代码。

如果在实现时候觉得代码有缺陷用TODO注释起来。

TODO注释应该包含全部大写的字符串TODO,接着是括号中你的用户名。冒号是可选的。最好在TODO条目之后加上bug或者ticket的序号。

例如

# TODO(曹曹曹老板来了):此处可能存在不匹配的未知场景错误(bug ###)

格式

缩进

❕Tip
缩进两个空格,没有制表符。

这一点很重要,平时代码过程忌讳制表符缩进,统一使用两个空格。

行的长度和长字符串

❕Tip
行的最大长度是80个字符。

循环

❕Tip
请将; do,; t hen和while,for,if放在同一行。

循环结构尽量一次写完整再写循环体语句。

例如

# for循环语句
for fir in ${dirs_to_cleanup}; doif [[ -d "${ORACLE_SID}" ]]; thenlog_date "Cleaning up old files in ${dir}/${ORACLE_SID}"rm "${dir}/${ORACLE_SID}"*if [[ "$?" -ne 0 ]]; thenerror_messagefielsemkdir -p "${dir}/${ORACLE_SID}"if [[ "$?" -ne 0 ]]; thenerror_messagefifi
done

这里有几个细节:

  • 缩进采用两个空格
  • if [[ "$?" -ne 0 ]] 需要和[ ] 留有一个空格(必须)
  • if 语句使用的 [[ ]] 而不是 [ ]

case语句

❕Tip
- 通过两个空格缩进可选项。
- 在同一行可选项的模式右圆括号之后和结束符;;之前各需要一个空格。
- 长可选项或者多命令可选项应该被拆分成多行,模式、操作、和结束符;;在不同的行。

匹配表达式比case和esac缩进一级。多行操作要再缩进一级。一般情况下,不需要引用匹配表达式。模式表达式前面不应该出现左括号。避免使用;&和;;&符号。

例如

# 匹配不同命令执行不同的函数
case "${input}" instart) echo "开始启动程序..."start ${APP_NAME};;stop)echo "开始停止程序..."stop ${APP_NAME};;*)error "未知表达式。";;
esac

变量扩展

❕Tip
按优先级顺序:保持跟你所发现的一致;引用你的变量;推荐用${var}而不是$var

引用

❕Tip
除非需要小心不带引号的扩展,否则总是引用包含变量、命令替换符、空格或shell元字符的字符串。

使用变量时尽量带上引号,即 "${val}"

  • 推荐引用是单词的字符串(而不是命令选项或者路径名)。
  • 千万不要引用整数。
  • 注意[[中模式匹配的引用规则。
  • 请使用$@ 除非你有特殊的原因需要使用$*

特性及错误

命令替换

❕Tip
使用$(command)而不是反引号`command`。

嵌套的反引号要求用反斜杠转义内部的反引号。而$(command)形式嵌套时不需要改变,而且更易于阅读。

例如

# 倾向于这种
var="$(command "$(command)")"# 而不是这种
var="`command \`command\``"

test,[ 和 [[

❕Tip
推荐使用[[ ... ]]而不是[,test,和/usr/bin/[。

因为在[[和]]之间不会有路径名称扩展或单词分割发生,所以使用[[ … ]]能够减少错误。而且[[ … ]]允许正则表达式匹配,而[ … ]不允许。

测试字符串

❕Tip
尽可能使用引用,而不是过滤字符串。

Bash足以在测试中处理空字符串。所以,请使用空(非空)字符串测试,而不是填充字符,使得代码更易于阅读。

例如

# 推荐 -- 匹配字符串
if [[ "${my_var}" = "some_string"]]; then# TODO
fi# 推荐 -- 判断字符串是否为空
if [[ -z "${my_var}" ]]; then# TODO
fi# 推荐 -- 判断字符串不为空
if [[ -n "${my_var}" ]]; then# TODO
fi# 不推荐 -- 匹配字符串
if [[ "${my_var}X" = "some_stringX"]]; then# TODO
fi# 不推荐 -- 判断字符串是否为空
if [[ "${my_var}" = "" ]]; then# TODO
fi

文件名的通配符扩展

❕Tip
当进行文件名的通配符扩展时,请使用明确的路径。

因为文件名可能义-开头,所以使用扩展通配符./*比 * 来得安全的多。

Eval

❕Tip
应该避免使用eval。

当用于给变量赋值时,Eval解析输入,并且能够设置变量,但无法检查这些变量时什么。

管道导向while循环

❕Tip
请使用过程替换或者for循环,而不是管道导向while循环。在while循环中被修改的变量是不能传递给父shell的,因为循环命令时在一个子shell中运行个的。

例如

# 推荐
while read count filename; dototal+="${count}"last_file="${filename}"
done << (your_command | uniq -c)# 不推荐
last_line='NULL'
your_command | while read line; dolast_line="${line}"
done# 会输出NULL,因为管道命令 last_line="${line}"
# 是在子shell中进行的,而父shell中last_line变量还是NULL
echo "${last_line}"#

命名约定

函数名

❕Tip
使用小写字母,并用下划线分割单词。使用双冒号::分割库。函数名之后必须有圆括号。关键词function是可选的,但必须在一个项目中保持一致

当函数名后存在( )时,关键词function是多余的。但是其促进了函数的快速辨识。

变量名

❕Tip
如函数名。

常量和环境变量名

❕Tip
全部大写,用下划线分割,声明在文件的顶部。

源文件名

❕Tip
小写,如果需要的话使用下划线分割单词。

注意这里,源文件名是采用小写而不是大写

使用本地变量

❕Tip
使用local声明特定功能的变量。声明和赋值应该在不同行

例如

my_func2(){local name="$1"# 声明和赋值应该在不同行local my_varmy_var="${my_func}" || return# 不推荐这种# 当赋值的值由命令替换时,声明和赋值必须分开。因为内建的 local 不会从命令替换中传递退出码local my_var="${my_func}"
}

调用命令

检查返回值

❕Tip
总是检查返回值,并给出信息返回值

对于非管道命令,使用$?或直接通过一个if语句来检查保持其简洁

例如

if ! mv "${file_list}" "${dest_dir}/" ; thenecho "无法移动 ${file_list} 到 ${dest_dir}" >&2exit "${E_BAD_MOVE}"
fi# 或者
mv "${file_list}" "${dest_dir}/"
if [[ "$?" -ne 0 ]]; then  # 命令执行成功正常退出码为0。 -ne 不等于echo "无法移动 ${file_list} 到 ${dest_dir}" >&2exit "${E_BAD_MOVE}"
fi

终于抄完作业了!

谷歌Shell脚本编程规范笔记相关推荐

  1. shell脚本编程学习笔记6(xdl)——字符串截取命令

    shell脚本编程学习笔记6--字符串截取命令 1,cut命令 [root@localhost ~]# cut [选项] 文件名-f 列号,表示提取第几列-d 分隔符,按照指定的分隔符分割列注意:默认 ...

  2. shell脚本编程学习笔记8(XDL)——流程控制和循环

    shell脚本编程学习笔记8--流程控制和循环 1,if语句 1,框架 1,单分支:if [条件判断式] ;thenprogramfiif [条件判断式]thenprogramfi注意:if语句使用f ...

  3. shell脚本编程学习笔记1(xdl)——shell基础与Bash基本功能()

    shell脚本编程学习笔记1--shell基础与Bash基本功能 1,简介: 1,Shell就是一个命令行解释器,用以连接输入设别和内核. 2,Shell是解 释执行的脚本语言,在Shell中可以直接 ...

  4. shell脚本编程学习笔记5(xdl)——正则表达式

    shell脚本编程学习笔记5--正则表达式 1,简介 正则表达式,用来在文件中匹配符合条件的字符串,包含匹配.注意是文件中选择字符串,和通配符是 不同的.grep,awk,sed等命令可以支持正则表达 ...

  5. shell脚本编程学习笔记2(xdl)——Bash变量

    shell脚本编程学习笔记2--Bash变量 1,变量简介 1,计算机内存单元2,设置规则字母数组下划线组成,不能以数字开头Bash中,默认类型字符串型,变量类型可修改 2,Bash变量规则 1,变量 ...

  6. shell脚本编程学习笔记4(xdl)——Bash常见环境变量

    shell脚本编程学习笔记4--Bash常见环境变量 非专业运维,例如开发人员,环境变量熟悉常见的,了解不常见的即可. 1,简介 环境变量配置文件中主要是定义对系统的 操作环境生效的系统默认环境变量, ...

  7. linux命令行和shell脚本编程大全笔记

    第1章        初识Linux shell 内存存储单元按组划分成很多块,这些块称作页面(page) Linux操作系统将运行中的程序称为进程.进程可以在前台运行,将输出显示在屏幕上,也 可以在 ...

  8. Linux Shell脚本编程学习笔记和实战

    http://www.1987.name/141.html shell基础 终端打印.算术运算.经常使用变量 Linux下搜索指定文件夹下特定字符串并高亮显示匹配关键词 从键盘或文件里获取标准输入 [ ...

  9. Shell脚本编程基础笔记一

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/8176137.html 一:脚本文件的创建.格式.运行 1:创建shell脚本 首先,要创建一个文件 touch ...

最新文章

  1. 二十三、oracle pl/sql分类三 包
  2. html audio 本地无效源,音频文件无法播放?H5的audio标签在win7下运行时报错“无效源”?...
  3. hdu 2824The Euler function
  4. Linux文件基本操作管理
  5. 记一次应用配置的数据库连接被打满问题
  6. LeetCode MySQL 534. 游戏玩法分析 III
  7. 服务器图文消息发送规则,群发图文规则 - CurtainRight的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 获取数据库名称dbName
  9. android frida 检测_Android 逆向 | Frida 是万能的吗? 检测 Frida 的几种办法
  10. ASP.NET-关于Container dataitem 与 eval方法介绍(转帖)
  11. EXCEL教程下载地址
  12. java dateutils工具类_DateUtils 日期工具类
  13. 二进制数的算术运算和逻辑运算
  14. MAC 安装 kafka
  15. 安装dhcp服务器虚拟2012,windows server 2012 dhcp服务器安装
  16. KY261 Jugs
  17. 东方财富一面、二面总结(二面凉)
  18. 【Python处理EXCEL】--pandas导入Excel文件
  19. 6个非常实用的 Python 代码块,适合收藏~
  20. ERP(用友)-账套管理

热门文章

  1. 几分钟了解云服务器ECS
  2. IDEA版本和JDK版本对应关系
  3. window redis版本下载
  4. 为什么软件测试计划重要性,谈谈“测试计划”这点事
  5. 精伦iDR211二代证阅读器技术规格说明书
  6. Linux设置网络缓冲区大小(TCP/UDP)
  7. C++标准库 vector排序
  8. (六)《数电》——二极管与CMOS门电路(入门)
  9. c语言如何输入输出string类型的数据
  10. 详解Unity中的粒子系统Particle System (六)