Bash的Exit命令和Exit代码
在编写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结尾而没有指定参数,那么脚本的退出代码就是脚本中最后执行的命令的退出代码。
#!/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。
如果你有任何问题或反馈意见,请随时留言。