跳转至内容

Bash Shell 脚本/退出状态

来自维基教科书,开放的书籍,开放的世界

当一个进程完成时,它会返回一个小的非负整数,称为它的退出状态返回状态给操作系统。按照惯例,如果它成功完成,则返回零,如果它失败并出现错误,则返回一个正数。(这种方法允许使用不同的正数来区分多个不同的错误。)Bash 脚本可以通过使用内置命令exit来遵守此惯例。以下命令

exit 4

终止 shell 脚本,返回退出状态为 4,表示某种错误。当没有指定退出状态时(无论是由于exit在没有参数的情况下运行,还是由于脚本在没有调用exit的情况下结束),脚本将返回它运行的最后一个命令的退出状态。

退出状态的一种使用方法是使用 Bash 运算符&&(“与”)和||(“或”)。如果两个命令用&&分隔,则首先运行左侧的命令,只有第一个命令成功时才会运行右侧的命令。相反,如果它们用||分隔,则只有左侧命令失败时才会运行右侧的命令。

例如,假设我们要删除文件file.txt并将其重新创建为一个空文件。我们可以使用常见的 Unix 工具rm(“移除”)来删除它,并使用常见的 Unix 工具touch来重新创建它;所以,我们可以这样写

rm file.txt
touch file.txt

但实际上,如果rm失败,我们不想运行touch:如果我们最初未能删除文件,我们不想重新创建它。所以,我们可以改写成这样

rm file.txt && touch file.txt

这与之前相同,只是它不会尝试运行touch,除非rm成功。

第三个类似布尔运算符!(“非”)会反转命令的退出状态。例如,此命令

! rm file.txt

等效于rm file.txt,只是它在rm表示失败时会表示成功,反之亦然。(当退出状态用作实际退出状态时,这通常没有用,表示成功或失败,但我们很快就会看到一些扩展的退出状态用法,其中“非”操作更有用。)

命令的退出状态(简而言之)可以通过$?访问。当需要区分多个不同的失败状态时,这会很有用;例如,grep命令(搜索文件中与指定模式匹配的行)在找到匹配项时返回 0,在没有找到匹配项时返回 1,在发生真正的错误时返回 2。

华夏公益教科书