Bash的Exit命令和Exit代码

评论 0 浏览 0 2020-06-09

在编写Bash脚本时,经常需要在满足某个条件时终止脚本,或者根据命令的退出代码来采取行动。

在这篇文章中,我们将介绍Bash exit的内置命令和所执行的命令的退出状态。

退出状态

每条shell命令在终止时都会返回一个退出代码,不管是成功还是不成功。

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

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

date &> /dev/nullecho $?

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

输出

0

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

ls /nonexisting_dir &> /dev/nullecho $?

输出

2

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

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

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

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

Bash exit命令

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

exit N

如果没有给出N,则退出状态码是最后执行的命令的状态码。

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

实例分析

命令的退出状态可用于条件性命令,如if 。在下面的例子中,如果在filename中找到了 "search-string",grep将以0退出(在shell脚本中意味着真)。

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结尾而没有指定参数,那么脚本的退出代码就是脚本中最后执行的命令的退出代码。

~/script.sh
#!/bin/bash

echo "doing stuff..."

exit

只使用exit,与exit $?或省略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。

如果你有任何问题或反馈意见,请随时留言。

最后更新2023-06-28
0 个评论
标签