文章目录
{ .ImgAlt }}

通常,在写 Bash 脚本的时候,你需要在某个特定条件下终止脚本,并且基于退出代码来采取行动。

在本文中,我们将会涉及 Bash exit内建命令,以及执行命令后的退出状态。

一、退出状态

每一个 Shell 在退出时,都会返回一个状态代码。成功或者不成功。

按照惯例,退出代码为0显示命令成功地执行,而非0意味着有错误发生。

特殊变量$?返回最后执行命令的状态。

date &> /dev/null
echo $?

date命令成功完成,退出代码为0:

0

如果你尝试在一个不存在的目录上运行ls,退出代码为非0:

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

状态代码可以被用来查找命令是否失败。每一个命令的手册页面包含退出代码的信息。

当执行多个命令组成的管道时,管道的退出状态是最后一个命令的:

sudo tcpdump -n -l | tee file.out
echo $?

在上面的例子中echo $?将会打印tee命令的退出代码。

二、Bash exit 命令

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

exit N

如果N没有给出,退出状态代码是最后一个命令的退出状态代码。

在 shell 脚本中使用的时候, 提供给exit命令的参数将会作为退出代码返回给 shell。

三、示例

命令的退出状态可以被用在条件命令中,例如if。在下面的例子中,如果“search-string” 在filename文件中被找到,grep以状态0(在 shell 脚本中意味着 true)退出:

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

在运行一系列由&&(AND)或者||(OR)分隔的命令,命令的退出状态取决于列表中的下一个命令是否会被执行。这里,如果cd返回0,那么mkdir命令将会被执行:

cd /opt/code && mkdir project

如果一个脚本以exit结尾并且不指定参数,这个脚本的退出代码将会是脚本中最后一个命令执行的退出状态:

#!/bin/bash

echo "doing stuff..."

exit

仅仅使用exitexit $?或者省略exit是一样的。

下面是一个例子,显示如果是非 root 用户运行,应该如何终止脚本:

#!/bin/bash

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

echo "doing stuff..."

exit 0

如果以 root 身份运行脚本,退出代码将会是0.否则,脚本将会以状态1退出。

四、总结

每一个 shell 命令在终止时都会返回一个退出代码。exit命令被用来以指定状态退出 shell。

腾讯云:助力中小微企业上云,满足轻量级Web应用需求,云服务器钜惠 166元/年起



如果你有任何疑问,请通过以下方式联系我们:

微信:

微信群: 加上面的微信,备注微信群

QQ: 3217680847

QQ 群: 82695646 雪梦科技交流群

原文 :https://linuxize.com/post/bash-exit/

    版权声明:本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。知识共享许可协议
腾讯云:新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。

相关推荐