Linux系统编程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2.3 它是如何工作的

test是一个小型实用程序,用于测试文件和目录、比较数值等。在我们的例子中,用它来测试指定的文件或目录是否存在(-e表示存在)。

test程序不会打印任何输出,只会默默地执行完成并退出。但是,它会留下一个返回值。我们可以使用变量$?检查返回值。而脚本里的if语句检查的正是该变量。

在脚本中,我们还使用了一些其他的特殊变量。第一个是$#,它表示传递给脚本的参数个数。它的工作原理和C语言中的argc类似。在脚本的开始位置,我们比较了$#是否不等于1(-ne代表不等于)。如果$#不等于1,则打印一个错误消息,脚本终止,并返回退出码1。

把$#放在引号里是一种安全机制。在某些不可预见的事件中,如果$#包含空格,我们希望仍然将其内容作为单个值计算,而不是两个值。脚本中其他变量添加引号也是出于相同原因。

下一个特殊变量是$0。这个变量表示第0个参数,也就是程序的名称,类似于我们在第1章中所介绍的C语言里的argv[0]。

如test语句所显示的那样,程序的第一个参数存储在$1中。在我们的例子中,第一个参数是我们所提供的想要进行测试的文件名或目录。

与C程序一样,我们希望脚本以一个有意义的返回值(即退出码)退出。我们使用exit来退出脚本并设置一个返回值。如果用户没有明确地提供一个参数,我们将使用代码1退出脚本,这是一个通用的错误码。如果脚本按照正常的方式执行,并且文件或目录存在,那么退出码为0。如果脚本按正常的方式执行,但是文件或目录不存在,则设置退出码为3,该退出码并非为了特定用途而保留,但仍表示一个错误(所有非0的退出码都是错误码)。这样,其他脚本就可以获取到脚本的返回值并对其进行操作。

在第5步中,我们就是这样做的——使用以下命令对脚本的退出码进行操作:

&&意味着“与”。我们可以将这一行命令视为一个if语句。如果exist.sh返回真,即退出码为0,则执行echo命令;如果退出码不为0,那么echo命令将永远不会被执行。

在步骤6中,我们将脚本的所有输出重定向到/dev/null,然后使用一个完整的if语句来检查错误码3。如果脚本返回错误码3,则使用echo命令打印一条语句。