开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
前言
这种先确定上层步骤,然后再逐步细化这些步骤的过程被称为自顶向下设计
。
这种技巧允许我们把庞大而复杂的任务分割为许多小而简单的任务。自顶向下设计是一种常见的程序设计方法,尤其适合 shell 编程。
在这一章中,我们将使用自顶向下
的设计方法来进一步开发我们的报告产生器脚本。
目前我们的脚本执行以下步骤来产生这个 HTML 文档:
-
打开网页
-
打开网页标头
-
设置网页标题
-
关闭网页标头
-
打开网页主体部分
-
输出网页标头
-
输出时间戳
-
关闭网页主体
-
关闭网页
一、自顶向下设计
1.1 局部变量
目前我们所写的脚本中,所有的变量(包括常量)都是全局变量。全局变量在整个程序中保持存在。对于许多事情来说,这很好,但是有时候它会使 shell 函数的使用变得复杂。
在shell 函数中,经常期望会有局部变量。局部变量只能在定义它们的 shell 函数中使用,并且一旦 shell 函数执行完毕,它们就不存在了。
拥有局部变量允许程序员使用的局部变量名,可以与已存在的变量名相同,这些变量可以是全局变量,或者是其它 shell 函数中的局部变量,却不必担心潜在的名字冲突。
这里有一个实例脚本,其说明了怎样来定义和使用局部变量:
#!/bin/bash
# local-vars: script to demonstrate local variables
foo=0 # global variable foo
funct_1 () {
local foo # variable foo local to funct_1
foo=1
echo "funct_1: foo = $foo"
}
funct_2 () {
local foo # variable foo local to funct_2
foo=2
echo "funct_2: foo = $foo"
}
echo "global: foo = $foo"
funct_1
echo "global: foo = $foo"
funct_2
echo "global: foo = $foo"
正如我们所看到的,通过在变量名之前加上单词 local,来定义局部变量。这就创建了一个只对其所在的 shell 函数起作用的变量。
我们看到对两个 shell 函数中的局部变量 foo 赋值,不会影响到在函数之外定义的变量 foo的值。
这个功能就允许 shell 函数能保持各自以及与它们所在脚本之间的独立性。这个非常有价值,因为它帮忙阻止了程序各部分之间的相互干涉。这样 shell 函数也可以移植。也就是说,按照需求,shell 函数可以在脚本之间进行剪切和粘贴。
1.2 保持脚本运行
当开发程序的时候,保持程序的可执行状态非常有用。这样做,并且经常测试,我们就可以在程序开发过程的早期检测到错误。这将使调试问题容易多了。例如,如果我们运行这个程序,做一个小的修改,然后再次执行这个程序,最后发现一个问题,非常有可能这个最新的修改就是问题的来源。通过添加空函数,程序员称之为占位符,我们可以在早期阶段证明程序的逻辑流程。
当构建一个占位符的时候,能够包含一些为程序员提供反馈信息的代码是一个不错的主意,这些信息展示了正在执行的逻辑流程。现在看一下我们脚本的输出结果:
[me@linuxbox ~]$ sys_info_page
<HTML>
<HEAD>
<TITLE>System Information Report For twin2</TITLE>
</HEAD>
<BODY>
<H1>System Information Report For linuxbox</H1>
<P>Generated 03/19/2009 04:02:10 PM EDT, by me</P>
</BODY>
</HTML>
总结
这一章中,我们介绍了一种常见的程序设计方法,叫做自顶向下设计,并且我们知道了怎样使用 shell 函数按照要求来完成逐步细化的任务。
我们也知道了怎样使用局部变量使 shell 函数独立于其它函数,以及其所在程序的其它部分。
这就有可能使 shell 函数以可移植的方式编写,并且能够重复使用,通过把它们放置到多个程序中;
节省了大量的时间。