Bash的Exit命令和Exit代码
在编写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
。在下面的例子中,如果在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。
如果你有任何问题或反馈意见,请随时留言。