BASH的保护性编程技巧

  • A+
所属分类:Shell
又拍云upyun

这是我写BASH程序的招式。这里本没有什么新的内容,但是从我的经验来看,人们爱滥用BASH。他们忽略了计算机科学,而从他们的程序中创造的是“大泥球”(译注:指架构不清晰的软件系统)。

在此我告诉你方法,以保护你的程序免于障碍,并保持代码的整洁。

不可改变的全局变量

  • 尽量少用全局变量
  • 以大写命名
  • 只读声明
  • 用全局变量来代替隐晦的$0,$1等
  • 在我的程序中常使用的全局变量:

一切皆是局部的

所有变量都应为局部的。

  • 自注释(self documenting)的参数
  • 通常作为循环用的变量i,把它声明为局部变量是很重要的。
  • 局部变量不作用于全局域。

main()

  • 有助于保持所有变量的局部性
  • 直观的函数式编程
  • 代码中唯一的全局命令是:main

一切皆是函数

  • 唯一全局性运行的代码是:

- 不可变的全局变量声明

- main()函数

  • 保持代码整洁
  • 过程变得清晰

  • 第二个例子好得多。查找文件是temporary_files()的问题而非main()的。这段代码用temporary_files()的单元测试也是可测试的。
  • 如果你一定要尝试第一个例子,你会得到查找临时文件以和main算法的大杂烩。

如你所见,这个测试不关心main()。

调试函数

  • 带-x标志运行程序:

只调试一小段代码,使用set-x和set+x,会只对被set -x和set +x包含的当前代码打印调试信息。

打印函数名和它的参数:

调用函数:

会打印到标准输出:

代码的清晰度

这段代码做了什么?

让你的代码说话:

每一行只做一件事

  • 用反斜杠\来作分隔符。例如:

可以写得简洁得多:

  • 符号在缩进行的开始

符号在行末的坏例子:(译注:原文在此例中用了temporary_files()代码段,疑似是贴错了。结合上下文,应为print_dir_if_not_empty())

好的例子:我们可以清晰看到行和连接符号之间的联系。

打印用法

不要这样做:

它应该是个函数:

echo在每一行重复。因此我们得到了这个文档:

注意在每一行的行首应该有一个真正的制表符‘\t’。

在vim里,如果你的tab是4个空格,你可以用这个替换命令:

命令行参数

这里是一个例子,完成了上面usage函数的用法。我从Kirk’s blog post – bash shell script to use getopts with gnu style long positional parameters得到这段代码

你像这样,使用我们在头上定义的不可变的ARGS变量:

单元测试

  • 在更高级的语言中很重要。
  • 使用shunit2做单元测试

这里是另一个使用df命令的例子:

这里我有个例外,为了测试,我在全局域中声明了DF为非只读。这是因为shunit2不允许改变全局域函数。

原文:http://www.kfirlavi.com/blog/2012/11/14/defensive-bash-programming/

译文:http://blog.jobbole.com/73257/

weinxin
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
默北

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  1   博主  0

    • ★Extreme★ 1

      看您网站的内容,可以肯定管理员您是一个高人,佩服,佩服,值得我向管理员您学习学习,此网站可以说是一个宝库,收藏啦!