退出和退出状态码
大家都知道exit
是用来退出一个脚本,既可以使用exit
来结束一个脚本,像常用的C语言一样,它也会返回一个值,这个值会传递给脚本的父进程,父进程会使用这个值做下一步的处理。
其实在linux
中执行任何一个命令都会返回一个退出码,成功的命令返回0,而不成功的命令返回非零值,非零值通常通常都会解释成一个错误码。
当然脚本中的函数和脚本本身也会返回退出状态码,在脚本中最后执行的命令决定脚本返回的状态码(就是exit之前的命令)
#!/bin/bash
tldr ls
. . .
# 在执行exit之前的一个命令决定脚本返回值状态码值
ls -l name
exit
# exit $?
不带参数的exit命令和exit $?的效果是一样的,就算你在脚本的末尾不写exit效果也是一样的
bash
脚本中$?
保存这最后执行命令的退出状态码,当函数返回之后,$?
同样保存函数中最后执行的命令的退出状态码,这就是bash
对函数返回值的处理方法,同样,当一个脚本退出$?
保存了脚本的退出状态码,这个退出状态码就是脚本中最后执行的命令的退出状态码。
#!/bin/bash
echo hello
echo $?
# 退出状态为0, 因为命令执行成功.
lskdf
# 无效命令.
echo $?
# 非零的退出状态, 因为命令执行失败.
echo
exit 113
# 返回113退出状态给shell.
# 为了验证这个结果, 可以在脚本结束的地方使用"echo $?".
# 执行结果
andrew@andrew:/work/bash/src$ bash exit_example.sh
hello
0
exit_example.sh: 行 5: lskdf: 未找到命令
127
andrew@andrew:/work/bash/src$ echo $?
113
使用$?
测试脚本中命令执行的结果,往往显得特别的有用
!
逻辑非操作,将会反转命令或条件的测试结果,将会影响退出状态码
true # "true" 是内建命令.
echo "exit status of \"true\" = $?"
# 0
! true
echo "exit status of \"! true\" = $?"
# 1
# 注意: "!" 需要一个空格.
# !true将导致"command not found"错误
# 如果一个命令以'!'开头, 那么会启用Bash的历史机制.
true
!true
# 这次就没有错误了, 也没有反转结果.
# 它只是重复了之前的命令(true).