侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

绿泡泡:___zze,添加备注来意

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Shell脚本编程(4)之退出脚本

zze
zze
2019-12-23 / 0 评论 / 0 点赞 / 555 阅读 / 2123 字

本部分内容参考自《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。

0

评论区