退出状态码
在 Shell 脚本中,每一行命令在执行完成之后,都会在 Shell 执行环境中保存其退出的状态码。
所有的 Shell 命令都使用退出状态码来告知 Shell 它执行结束了。
退出状态码是一个 0 ~ 255 的整数值。
Linux 提供了一个 $? 的特殊变量来获取上一条命令执行结束后的退出状态码的值。
如下示例,展示了状态码的使用:
echo 'Hello' ## 输出: Hello
echo $? ## 输出: 0, 表示上一条 echo 'Hello' 的命令执行成功
在 Linux 中提供了一些常用的退出状态码,如下表所示:
状态码 | 含义 |
|---|---|
0 | 命令执行成功并结束 |
1 | 一般性未知错误 |
2 | 不适合的 Shell 命令 |
126 | 命令不可执行 |
127 | 没找到命令 |
128 | 无效的退出参数 |
128+x | 与 Linux 信号 x 相关的严重错误 |
130 | 通过 Ctrl + C 终止的命令 |
255 | 正常范围之外的退出码 |
在 Shell 脚本编程中,我们没有必要记住所有的这些状态码。但需要注意以下几点:
0 表示命令执行成功的情况
非 0 值表示命令执行不成功的情况
我们来看一下执行错误的示例:
fdjafldajfdla ## 输出: fdjafldajfdla: 为找到命令
echo $? ## 输出: 127 表示没有找到命令
然后,我们来看一个实际的例子,检查某项服务是否已经启动:
#!/bin/bash
ps -ef | grep $1 | grep -v grep | grep -v sh
if [ $? -eq 0 ];then
echo 'already start...'
else
echo 'failed...'
fi
来执行这个脚本,如下:
sh service.sh nginx ## 如果没有启动 Nginx,输出: failed...
sh service.sh systemd ## 如果启动了 systemd,输出: already start...
上面的示例中,状态码的具体的值都是系统默认定义的。此外,我们也可以自定义状态码的输出,使用 exit 命令:
## 使用内联输入重定向创建测试的脚本文件
cat <<EOF > exit.sh
#!/bin/bash
exit 12
EOF
sh exit.sh ## 执行脚本文件
echo $? ## 输出: 12
Last modified: 04 August 2024