迄今为止所有的示例脚本中,我们都是突然停下来的。运行完最后一条命令时,脚本就结束
了。其实还有另外一种更优雅的方法可以为脚本划上一个句号。
shell中运行的每个命令都使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态
码是一个0~255的整数值,在命令结束运行时由命令传给shell。可以捕获这个值并在脚本中使用。
11.8.1 查看退出状态码
Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码。对于需要进行检查的
命令,必须在其运行完毕后立刻查看或使用$?变量。它的值会变成由shell所执行的最后一条命令
的退出状态码。
$ date
Sat Jan 15 10:01:30 EDT 2014
$ echo $?
0
$
按照惯例,一个成功结束的命令的退出状态码是0。如果一个命令结束时有错误,退出状态
码就是一个正数值。
$ asdfg
-bash: asdfg: command not found
$ echo $?
127
$
无效命令会返回一个退出状态码127。Linux错误退出状态码没有什么标准可循,但有一些可
用的参考,如表11-2所示。
退出状态码126表明用户没有执行命令的正确权限。
$ ./myprog.c
-bash: ./myprog.c: Permission denied
$ echo $?
126
$
另一个会碰到的常见错误是给某个命令提供了无效参数。
$ date %t
date: invalid date ‘%t’
$ echo $?
1
$
这会产生一般性的退出状态码1,表明在命令中发生了未知错误。
11.8.2 exit 命令
默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出。
$ ./test6
The result is 2
$ echo $?
0
$
你可以改变这种默认行为,返回自己的退出状态码。exit命令允许你在脚本结束时指定一
个退出状态码。
$ cat test13
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[$var1 + $var2]
echo The answer is $var3
exit 5
$
当查看脚本的退出码时,你会得到作为参数传给exit命令的值。
$ chmod u+x test13
$ ./test13
The answer is 40
$ echo $?
5
$
也可以在exit命令的参数中使用变量。
$ cat test14
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[$var1 + $var2]
exit $var3
$
当你运行这个命令时,它会产生如下退出状态。
$ chmod u+x test14
$ ./test14
$ echo $?
40
$
你要注意这个功能,因为退出状态码最大只能是255。看下面例子中会怎样。
$ cat test14b
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[$var1 * $var2]
echo The value is $var3
exit $var3
$
现在运行它的话,会得到如下输出。
$ ./test14b
The value is 300
$ echo $?
44
$
退出状态码被缩减到了0~255的区间。shell通过模运算得到这个结果。一个值的模就是被除
后的余数。最终的结果是指定的数值除以256后得到的余数。在这个例子中,指定的值是300(返
回值),余数是44,因此这个余数就成了最后的状态退出码。
在第12章中,你会了解到如何用if-then语句来检查某个命令返回的错误状态,以便知道命
令是否成功。