myfreax

Bash exit命令和exit退出代码

通常,在编写Bash脚本时,需要在满足特定条件时终止脚本,或者根据命令的退出代码采取措施

3 min read
By myfreax
Bash exit命令和exit退出代码

通常,在编写Bash脚本时,需要在满足特定条件时终止脚本,或者根据命令的退出代码采取措施。除此之外,退出代码还可以帮助我们解决程序的错误。

在本教程中,我们将介绍Bash内置命令exit和已执行命令的退出状态。包括使用echo $?打印命令的状态码,为shell脚本指定退出代码,我们列举一个列子说明退出状态码在bash脚本的应用。

命令的退出状态

每个shell命令执行的成功或失败均返回退出代码。按照惯例,退出代码为零表示命令成功完成,而非零表示遇到错误。特殊变量$?返回最后执行命令的退出状态:

date &> /dev/null

上面的date命令示例将成功完成执行,我们可以通过打印$?变量来查看退出代码:

echo $?

这打印date命令退出代码为零:

0

如果您尝试在不存在的目录上运行ls,则退出代码将为非零值:

ls /nonexisting_dir &> /dev/null
2
echo $?

状态码可用于找出命令失败的原因。 每个命令的手册页都包含有关退出代码的信息。执行多命令管道时,管道的退出状态为最后一条命令的退出状态:

sudo tcpdump -n -l | tee file.out

在上述示例中,echo $?将打印显示tee命令的退出代码。

Bash exit命令

exit命令以状态N退出shell,N是数字, 它具有以下语法:

exit N

如果未给出N,则退出状态代码为最后执行的命令的代码。在shell脚本中使用时,exit命令的参数,将作为退出代码返回给shell。

范例

exit命令的退出状态可用于命令的条件,例如if。 在下面的示例中,如果在filename中找到“search-string”,则grep将以零退出(这在shell脚本中表示为true):

if grep -q "search-string" filename then
  echo "String found."
else
  echo "String not found."
fi

运行在&&(与)或||(或)命令时,命令的退出状态用于确定是否将执行列表中的下一个命令。 以下示例仅当cd命令返回零时,才会执行mkdir命令

cd /opt/code && mkdir project

如果脚本以exit结尾,但未指定参数。则脚本退出代码是脚本中最后执行命令的退出代码。

#!/bin/bash

echo "doing stuff..."

exit
〜/script.sh

使用exitexit $?相同。以下示例显示了如何由非root用户调用exit来终止脚本:

#!/bin/bash

if [[ "$(whoami)" != root ]]; then
  echo "Only user root can run this script."
  exit 1
fi

echo "doing stuff..."

exit 0

如果您以root身份运行脚本,则退出代码将为零。 否则,脚本将以状态码1退出。

结论

每个shell命令终止时都会返回退出代码。 exit命令用于指定退出状态码返回给shell。如果您有任何问题或反馈,请随时发表评论。