本部分内容参考自《Linux命令行与shell脚本编程大全 第3版》。
迄今为止所有的示例脚本中,我们都是突然停下来的。运行完最后一条命令时,脚本就结束了。其实还有另外一种更优雅的方法可以为脚本划上一个句号。
Shell 中运行的每个命令都使用退出状态码(exit status)告诉 Shell 它已经运行完毕。退出状态码是一个 0~255 的整数值,在命令结束运行时由命令传给 Shell。可以捕获这个值并在脚本中使用。
查看退出状态码
Linux 提供了一个专门的变量 $?
,来保存上个已执行命令的退出状态码。对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用 $?
变量。它的值会变成由 Shell 所执行的最后一条命令的退出状态码。
$ date
Tue Dec 17 16:08:53 CST 2019
$ echo $?
0
按照惯例,一个成功结束的命令的退出状态码是 0
。如果一个命令结束时有错误,退出状态码就是一个正数值。
$ asdfg
-bash: asdfg: command not found
$ echo $?
127
无效命令会返回一个退出状态码 127
。 Linux 错误退出状态码没有什么标准可循,但有一些可用的参考。
| 状态码 | 描述 |
| --- | --- |
| 0 | 命令成功结束 |
| 1 | 一般性未知错误 |
| 2 | 不适合的 Shell 命令 |
| 126 | 命令不可执行 |
| 127 | 没找到命令 |
| 128 | 无效的参数退出 |
| 128+x | 与 Linux 信号 x 相关的严重错误 |
| 130 | 通过 Ctrl+C 终止的命令 |
| 255 | 正常范围之外的退出状态码 |
退出状态码 126
表明用户没有执行命令的正确权限。
$ ./test1.sh
-bash: ./test1.sh: Permission denied
$ echo $?
126
另一个会碰到的常见错误是给某个命令提供了无效参数。
$ date %
date: invalid date ‘%’
$ echo $?
1
这会产生一般性的退出状态码1,表明在命令中发生了未知错误。
exit命令
默认情况下, Shell 脚本会以脚本中的最后一个命令的退出状态码退出。
你可以改变这种默认行为,返回自己的退出状态码。 exit
命令允许你在脚本结束时指定一个退出状态码。
$ cat test14.sh
#!/bin/bash
var1=10
var2=30
var3=$[$var1 + $var2]
echo The answer is $var3
exit 5
当查看脚本的退出码时,你会得到作为参数传给 exit
命令的值。
$ ./test14.sh
The answer is 40
$ echo $?
5
也可以在 exit
命令的参数中使用变量。
$ cat test15.sh
#!/bin/bash
var1=10
var2=30
var3=$[$var1 + $var2]
exit $var3
当你运行这个命令时,它会产生如下退出状态。
$ ./test15.sh
$ echo $?
40
注意,退出状态码值的范围为 0~255。
评论区