Bash exit命令和退出代码

时间:2020-03-05 15:31:36  来源:igfitidea点击:

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

在本文中,我们将介绍Bash的“exit”内置命令和已执行命令的退出状态。

退出状态

每个shell命令成功或者失败均返回终止时的退出代码。

按照惯例,退出代码为零表示命令已成功完成,非退出代码为零表示遇到错误。

特殊变量“ $?”返回最后执行的命令的退出状态:

date &> /dev/nullecho $?

'date'命令成功完成,并且退出代码为零:

0

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

ls /nonexisting_dir &> /dev/nullecho $?
2

状态代码可用于找出命令失败的原因。
每个命令的手册页都包含有关退出代码的信息。

执行多命令管道时,管道的退出状态为最后一条命令的退出状态:

sudo tcpdump -n -l | tee file.outecho $?

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

Bash“退出”命令

'exit'命令退出状态为'N'的shell。
它具有以下语法:

exit N

如果未给出“ N”,则退出状态代码是最后执行的命令的退出状态代码。

在shell脚本中使用时,作为“ exit”命令的参数提供的值将作为退出代码返回到shell。

例子

命令的退出状态可以在条件命令(例如'if')中使用。

在以下示例中,如果在“文件名”中找到“搜索字符串”,则“ grep”将以零退出(这在shell脚本中表示为true):

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

运行以“ &&”(AND)或者“ ||”分隔的命令列表时(OR),命令的退出状态确定是否将执行列表中的下一个命令。
其中仅当“ cd”返回零时,才会执行“ mkdir”命令:

cd /opt/code && mkdir project

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

~/script.sh

#!/bin/bash
echo "doing stuff..."
exit

仅使用“ exit”与“ exit $?”相同。
或者省略“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'退出。