函数的退出代码是其最后一个命令的退出代码

考虑此示例函数来检查主机是否已启动:

is_alive() {
    ping -c1 "$1" &> /dev/null
}

此函数将单个 ping 发送到第一个函数参数指定的主机。ping 的输出和错误输出都被重定向到/dev/null,因此该函数将永远不会输出任何内容。但是 ping 命令在成功时将具有退出代码 0,在失败时将具有非零。由于这是函数的最后一个(在此示例中是唯一的)命令,ping 的退出代码将重用于函数本身的退出代码。

这个事实在条件语句中非常有用。

例如,如果主机 graucho 已启动,则使用 ssh 连接到它:

if is_alive graucho; then
    ssh graucho
fi

另一个例子:反复检查直到主机 graucho 启动,然后用 ssh 连接到它:

while ! is_alive graucho; do
    sleep 5
done
ssh graucho