摘自《高级bash脚本编程指南》
退出状态和退出状态码
exit 被用来结束一个脚本, 就像在C语言中一样. 它也返回一个值, 并且这个值会传递给脚本的父进程, 父进程会使用这个值做下一步的处理.
每个命令都会返回一个 退出状态码 (有时候也被称为 返回状态 ). 成功的命令返回0, 而不成功的命令返回非零值, 非零值通常都被解释成一个错误码. 行为良好的UNIX命令, 程序, 和工具都会返回0作为退出码来表示成功, 虽然偶尔也会有例外.
同样的, 脚本中的函数和脚本本身也会返回退出状态码. 在脚本或者是脚本函数中执行的最后的命令会决定退出状态码. 在脚本中, exit nnn命令将会把 nnn退出码传递给shell( nnn必须是十进制数, 范围必须是0 – 255).
当脚本以不带参数的exit命令来结束时, 脚本的退出状态码就由脚本中最后执行的命令来决定(就是exit之前的命令).1 #!/bin/bash
2
3 COMMAND_1
4
5 . . .
6
7 # 将以最后的命令来决定退出状态码.
8 COMMAND_LAST
9
10 exit
不带参数的exit命令与 exit $? 的效果是一样的, 甚至脚本的结尾不写exit, 也与前两者的效果相同.
$? 保
存了最后所执行的命令的退出状态码. 当函数返回之后, $?保存函数中最后所执行的命令的退出状态码. 这就是bash对函数”返回值”的处理方法.
当一个脚本退出, $?保存了脚本的退出状态码, 这个退出状态码也就是脚本中最后一个执行命令的退出状态码. 一般情况下, 0表示成功, 在范围1
– 255的整数表示错误.
$? 用于测试脚本中的命令结果的时候, 往往显得特别有用。
! 逻辑 “非”操作符, 将会反转命令或条件测试的结果, 并且这会影响退出状态码.
例:反转一个条件的用法!1 true # "true" 是内建命令.
2 echo "exit status of \"true\" = $?" # 0
3
4 ! true
5 echo "exit status of \"! true\" = $?" # 1
6 # 注意: "!" 需要一个空格.
7 # !true 将导致"command not found"错误
8 #
9 # 如果一个命令以'!'开头, 那么会启用Bash的历史机制.
10
11 true
12 !true
13 # 这次就没有错误了, 也没有反转结果.
14 # 它只是重复了之前的命令(true).
15
16 # 感谢, Stephane Chazelas和Kristopher Newsome.
条件判断
条件测试结构if/then 结构用来判断命令列表的退出状态码是否为0(因为在UNIX惯例, 0表示”成功”), 如果成功的话, 那么就执行接下来的一个或多个命令.
有一个专有命令[ (左中括号, 特殊字符). 这个命令与test命令等价, 并且出于效率上的考虑, 这是一个内建命令. 这个命令把它的参数作为比较表达式或者作为文件测试, 并且根据比较的结果来返回一个退出状态码(0 表示真, 1表示假).
在版本2.02的Bash中, 引入了[[ ... ]]扩展测试命令, 因为这种表现形式可能对某些语言的程序员来说更容易熟悉一些. 注意[[是一个关键字, 并不是一个命令.Bash把[[ $a -lt $b ]]看作一个单独的元素, 并且返回一个退出状态码.