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