shell中运行的每个命令都使用退出状态码来告诉shell自己已经运行完毕。退出状态码是一个0~255的整数值,在命令结束运行时由其传给shell。你可以获取这个值并在脚本中使用。
查看退出状态码
Linux提供了专门的变量$?来保存最后一个已执行命令的退出状态码。对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用$?变量。这是因为该变量的值会随时变成由shell所执行的最后一个命令的退出状态码:
$ date
Fri Jan 12 16:01:30 EDT 2024
$ 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 | 正常范围之外的退出状态码 |
exit命令
在默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出:
$ ./test
The result is 2
$ echo $?
0
你可以改变这种默认行为,返回自己的退出状态码。exit命令允许在脚本结束时指定一个退出状态码:
$ cat test6
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[ $var1 + $var2 ]
echo The answer is $var3
exit 5
当你检查脚本的退出状态码时,就会看到传给exit命令的参数值:
$ chmod u+x test6
$ ./test6
The answer is 40
$ echo $?
5
也可以使用变量作为exit命令的参数:
$ cat test7
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[ $var1 + $var2 ]
exit $var3
运行这个脚本时,会产生如下退出状态码:
$ chmod u+x test7
$ ./test7
$ echo $?
40
使用这个功能要小心,因为退出状态码最大只能是255。来看下面这个例子:
$ cat test7b
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[ $var1 * $var2 ]
echo The value is $var3
exit $var3
现在运行它会得到如下输出:
$ ./test7b
The value is 300
$ echo $?
44
退出状态码被缩减到了0~255的区间。shell通过模运算得到这个结果。一个值的模就是被除后的余数。最终的结果是指定的数值除以256后得到的余数。在这个例子中,指定的值是300(返回值),余数是44,因此这个余数就成了最后的退出状态码。