Linux shell 中运行的每一个命令都使用 退出状态码 来告诉shell命令已运行完毕。退出状态码值 0~255。
Linux 提供了一个专门的变量 $? 来保存上一个执行命令的退出状态码。
zzz@ubuntu:~/my_learning$ echo $? 0 zzz@ubuntu:~/my_learning$ pwd /home/zzz/my_learning zzz@ubuntu:~/my_learning$ echo $? 0 zzz@ubuntu:~/my_learning$ pwds Command 'pwds' not found, did you mean: command 'pwdx' from deb procps (2:3.3.16-1ubuntu2.3) command 'pwd' from deb coreutils (8.30-3ubuntu2) command 'pads' from deb pads (1.2-12) command 'pods' from deb pmtools (2.2.0-1) Try: sudo apt installzzz@ubuntu:~/my_learning$ echo $? 127 zzz@ubuntu:~/my_learning$
可以看到,当命令正确执行完毕后,退出状态码是0。如果命令结束时有错误,退出状态码是正值。
一些常见的状态码含义:
| 状态码 | 描述 |
|---|---|
| 0 | 命令成功结束 |
| 1 | 一般性未知错误 |
| 2 | 不适合的shell命令 |
| 126 | 命令不可执行 |
| 127 | 没找到命令 |
| 128 | 无效的退出参数 |
| 128+x | 与Linux信号x相关的严重错误 |
| 130 | 通过Ctrl+C终止的命令 |
| 255 | 正常范围之外的退出状态码 |
指定退出状态码
默认情况下,shell脚本会以脚本的最后一个命令的退出状态码退出。但是,可以使用 exit 命令来指定退出状态码。
zzz@ubuntu:~/my_learning$ vim test.sh zzz@ubuntu:~/my_learning$ cat test.sh #!/bin/bash a=1 zzz@ubuntu:~/my_learning$ . test.sh zzz@ubuntu:~/my_learning$ echo $? 0 zzz@ubuntu:~/my_learning$ vim test.sh zzz@ubuntu:~/my_learning$ cat test.sh #!/bin/bash a=1 exit 10 zzz@ubuntu:~/my_learning$ bash test.sh zzz@ubuntu:~/my_learning$ echo $? 10 zzz@ubuntu:~/my_learning$ zzz@ubuntu:~/my_learning$ vim test.sh zzz@ubuntu:~/my_learning$ cat test.sh #!/bin/bash a=1 exit 300 zzz@ubuntu:~/my_learning$ chmod u+x test.sh zzz@ubuntu:~/my_learning$ ./test.sh zzz@ubuntu:~/my_learning$ echo $? 44 zzz@ubuntu:~/my_learning$
可以看到,当指定的退出状态码的值超过255的范围时,会被缩减到0~255之间。最终的结果将是指定的值除以256后得到的余数。



