通常,在编写Bash脚本时,需要在满足特定条件时终止脚本,或者根据命令的退出代码采取措施。
在本文中,我们将介绍Bash exit
内置命令和已执行命令的退出状态。
退出状态
每个shell命令成功终止或失败均返回退出代码。
按照惯例,退出代码为零表示命令成功完成,而非零表示遇到错误。
特殊变量$?
返回最后执行的命令的退出状态:
date &> /dev/null
date
命令成功完成,并且退出代码为零:
0
如果您尝试在不存在的目录上运行ls
,则退出代码将为非零值:
ls /nonexisting_dir &> /dev/null
2
状态码可用于找出命令失败的原因。 每个命令的手册页都包含有关退出代码的信息。
执行多命令管道时,管道的退出状态为最后一条命令的退出状态:
sudo tcpdump -n -l | tee file.out
在上述示例中,echo $?
将显示 tee
命令的退出代码。
Bashexit
命令
exit
命令以状态N
退出shell。 它具有以下语法:
exit N
如果未给出N
,则退出状态代码为最后执行的命令的代码。
在shell脚本中使用时,作为exit
命令的参数提供的值将作为退出代码返回给shell。
范例
exit命令的退出状态可用于条件命令,例如 if
。 在下面的示例中,如果在filename
中找到“搜索字符串”,则grep
将以零退出(这在shell脚本中表示为true):
if grep -q "search-string" filename then
echo "String found."
else
echo "String not found."
fi
运行以&&
(与)或||
(或)分隔的命令列表时,命令的退出状态确定是否将执行列表中的下一个命令。 在此,仅当cd
返回零时,才会执行 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身份运行脚本,则退出代码将为零。 否则,脚本将以状态1
退出。
结论
每个shell命令终止时都会返回退出代码。 exit
命令用于退出具有给定状态的外壳。
如果您有任何问题或反馈,请随时发表评论。