shell简明教程2退出状态和返回代码

2 退出状态和返回代码

在本章中,您将学习如何确定给定命令的退出状态。还将学习如何在脚本中根据不同命令的退出状态做出决定。最后,还将学习如何在自己的脚本中使用退出状态。

每次执行命令都会返回一个退出状态。 退出状态有时也称为返回代码或退出代码,是范围从0到255的整数。 按照惯例,成功执行的命令返回0 。 如果遇到某种错误,则返回非零的退出状态。

这些返回代码可用于脚本的错误检查。 它可以是简单的测试,比如检查返回代码是否为0,也可以是复杂的测试,比如检查特定的错误代码。
如果想了解各种退出状态的含义,必须查阅给定命令的文档或查看其源代码。 你可以使用man和info命令来阅读系统中大多数命令的文档。 例如,在grep man页面中,grep 在找到搜索模式时以0退出,而在找不到时以1退出。

特殊变量$?包含之前执行命令的返回代码。 在这个shell脚本片段中,ls命令的调用路径是一个不存在的文件。

$ ls /not/here
ls: cannot access '/not/here': No such file or directory
$ echo $?
2

你可以使用命令的退出状态,根据退出状态做出决定或执行不同的操作。 在本示例 shell 脚本片段中,我们使用 ping 命令测试与 www.google.com 的网络连接。 ping 命令的 -c 选项只是告诉 ping 只发送一个数据包。

#!/bin/bash

HOST="google.com"

ping -c 1 $HOST

if [ "$?" -eq "0" ]
then
echo "$HOST reachable."
else
echo "$HOST unreachable."
fi

参考资料

可以使用逻辑 AND 和 OR。 双括弧(&&)表示AND,双管道(||)表示OR。 在下面的示例中,执行了mkdir /tmp/bak。 如果执行成功,cp 命令才会被执行。

cp test.txt /tmp/bak/ || cp test.txt /tmp

双管道后的命令只有在前一条命令失败时才会执行。 如果第一条命令返回非零的退出状态,则执行下一条命令。

mkdir /tmp/bak && cp test.txt /tmp/bak/

我们再来看看前面的例子。

#!/bin/bash
HOST="google.com"
ping -c 1 $HOST && echo "$HOST reachable."

如果想在一行中串联命令,可以用分号分隔这些命令。 分号不执行退出状态检查。 无论前一条命令是失败还是成功,分号后面的命令都会被执行。

cp test.txt /tmp/bak/ ; cp test.txt /tmp

不仅普通命令会返回退出状态,shell脚本也是如此。您可以使用exit命令来控制shell脚本的退出状态。只需在脚本中使用exit命令,并在命令后面加上0到255之间的数字即可。

如果您没有在exit命令中指定返回代码,那么之前执行的命令的退出状态将被用作退出状态。 如果在shell脚本中根本不包含exit命令也是如此。

#!/bin/bash

HOST="google.com"

ping -c 1 $HOST

if [ "$?" -ne "0" ]
then
echo "$HOST unreachable."
exit 1
fi

exit 0
posted @ 2023-08-26 19:38  磁石空杯  阅读(203)  评论(0编辑  收藏  举报