陈斌彬的技术博客

Stay foolish,stay hungry

Bash - 退出与退出状态码

一、退出状态码

1.退出

exit 被用来结束一个脚本,它也返回一个值,并且这个值会传递给脚本的父进程,父进程会使用这个值做下一步的处理。

2.退出状态码

每个命令都会返回一个退出状态码(有时候也被称为返回状态)。

成功的命令返回 0,不成功的命令返回非零值,非零值通常都被解释成一个错误码。行为良好的 UNIX 命令、程序和工具都会返回 0 作为退出码来表示成功,虽然偶尔也会有例外。

同样的,脚本中的函数和脚本本身也会返回退出状态码。在脚本或者是脚本函数中执行的最后的命令会决定退出状态码。在脚本中,exit nnn命令将会 nnn 退出码传递给 shell(nnn 必须是十进制数,范围必须是0-255)。

当脚本以不带参数的 exit 命令来结束时,脚本的退出状态码就由脚本中最后执行的命令来决定(就是 exit 之前的命令)。

3.一个例子

$ vim test.sh

输入代码:

 #!/bin/bash

 echo hello
 echo $?    # 退出状态为0, 因为命令执行成功.

 lskdf      # 无效命令.
 echo $?    # 非零的退出状态, 因为命令执行失败.

 echo

 exit 113   # 返回113退出状态给shell.
            # 为了验证这个结果, 可以在脚本结束的地方使用"echo $?". 

 #  一般的, 'exit 0' 表示成功,
 #+ 而一个非零的退出码表示一个错误, 或者是反常的条件

$? 指代的是上一条指令的执行结果。

不带参数的 exit 命令与 exit $? 的效果是一样的,甚至脚本的结尾不写 exit 也与前两者的效果相同。

运行代码:

$ bash test.sh

二、反转一个条件的用法

1.例子

! 逻辑“非”操作符,将会反转命令或条件测试的结果,并且这会影响退出状态码。

$ vim test.sh

输入代码:

 #!/bin/bash

 true  # "true" 是内建命令.
 echo "exit status of \"true\" = $?"     # 0

 ! true
 echo "exit status of \"! true\" = $?"   # 1
 # 注意: "!" 和指令间需要一个空格
 # 如果一个命令以'!'开头, 那么会启用Bash的历史机制.

 true
 !true
 # 这次就没有错误了, 也没有反转结果.
 # 它只是重复了之前的命令(true),这种语法在个别版本的bash中并不支持
运行代码:

$ bash test.sh

特定的退出状态码具有保留含义,所以用户不应该在脚本中指定它。