Linux Shell 脚本编程最佳实践IT路边社
前言
与其它的编码规范一样,这里所讨论的不仅仅是编码格式美不美观的问题,同时也讨论一些约定及编码标准 。这份文档主要侧重于我们所普遍遵循的规则,对于那些不是明确强制要求的 , 我们尽量避免提供意见 。
编码规范对于程序员而言尤为重要 , 有以下几个原因:
本文档中的准则致力于最大限度达到以下原则:
尽管本文档涵盖了许多基础知识 , 但应注意的是,没有编码规范可以为我们回答所有问题 , 开发人员始终需要再编写完代码后,对上述原则做出正确的判断 。
注 :未明确指明的则默认为必须(Mandatory)
主要参考如下文档:
仅建议Shell用作相对简单的实用工具或者包装脚本 。因此单个shell脚本内容不宜太过复杂 。
在选择何时使用shell脚本时时应遵循以下原则:
可执行文件不建议有扩展名,库文件必须使用 .sh 作为扩展名 , 且应是不可执行的 。
执行一个程序时,无需知道其编写语言,且shell脚本并不要求具有扩展名,所以更倾向可执行文件没有扩展名 。
而库文件知道其编写语言十分重要,使用 .sh 作为特定语言后缀的扩展名,可以和其他语言编写的库文件加以区分 。
文件名要求全部小写, 可以包含下划线 _ 或连字符 - , 建议可执行文件使用连字符,库文件使用下划线 。
正例:
反例:
源文件编码格式为UTF-8 。避免不同操作系统对文件换行处理的方式不同,一律使用 LF。
每行最多不超过120个字符 。每行代码最大长度限制的根本原因是过长的行会导致阅读障碍 , 使得缩进失效 。
除了以下两种情况例外:
如出现长度必须超过120个字符的字符串,应尽量使用here document或者嵌入的换行符等合适的方法使其变短 。
示例:
除了在行结束使用换行符,空格是源文件中唯一允许出现的空白字符 。
对从来没有用到的或者被注释的方法、变量等要坚决从代码中清理出去,避免过多垃圾造成干扰 。
Bash 是唯一被允许使用的可执行脚本shell 。
可执行文件必须以#!/bin/bash 开始 。请使用 set 来设置shell的选项,使得用 bashecho "Process $: Done making $$$."
# 示例7:命令参数及路径不需要引号grep -li Hugo /dev/ "$1"
# 示例8:常规变量用双引号,ccs可能为空的特殊情况可不用引号git send-email --to "${reviewers}" ${ccs:+"--cc" "${ccs}"}
# 示例9:正则用单引号,$1可能为空的特殊情况可不用引号grep -cP '([Ss]pecial||?characters*) ${1:+"$1"}
# 示例10:位置参数传递推荐带引号的"$@" , 所有参数作为单字符串传递用带引号的"$*"# content of t.shfunc_t {echo num: $#echo args: 1:$1 2:$2 3:$3}
func_t "$@"func_t "$*"# 当执行 ./t.sh a b c 时输出如下:num: 3args: 1:a 2:b 3:cnum: 1args: 1:a b c 2: 3:
使用$(command) 而不是反引号 。
因反引号如果要嵌套则要求用反斜杠转义内部的反引号 。而 $(command) 形式的嵌套无需转义,且可读性更高 。
正例:
反例:
条件测试
使用[[ ... ]] ,而不是 [ , test , 和 /usr/bin/[。
因为在[[ 和 ]] 之间不会出现路径扩展或单词切分 , 所以使用 [[ ... ]] 能够减少犯错 。且 [[ ... ]] 支持正则表达式匹配 , 而 [ ... ] 不支持 。参考以下示例:
尽可能使用变量引用,而非字符串过滤 。
Bash可以很好的处理空字符串测试 , 请使用空/非空字符串测试方法,而不是过滤字符,让代码具有更高的可读性 。正例:
推荐阅读
- 如何从事跨境电商,如何干跨境电商
- ios系统开放降级通道,苹果打开降级通道
- psp模拟器游戏,psp模拟器游戏文件放哪
- python如何编函数 python如何编写函数
- 如何隐藏资源库应用ios,隐藏iphone资源库
- 区块链新闻数据处理,区块链数据新闻指的是什么
- 新媒体写作如何找热点问题,2020新媒体热点研究问题
- go语言按空格读文件夹 go语言写入文件
- ios的安卓模拟器有哪些,哪些模拟器可以玩ios