[笔记]快乐的Linux命令行《二十七》自顶向下设计

90 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 函数以可移植的方式编写,并且能够重复使用,通过把它们放置到多个程序中;

节省了大量的时间。