BASH的保护性编程技巧

这是我写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不允许改变全局域函数。

1 收藏 3 评论

关于作者:cjpan

海上钢琴摄影攻城师,好吧,←每个位面都只是刚起步而已。(新浪微博:@潘成杰V) 个人主页 · 我的文章 · 3

相关文章

可能感兴趣的话题



直接登录
最新评论
跳到底部
返回顶部