bash-shell高级编程--退出和退出状态码

退出和退出状态码

大家都知道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).
发布了366 篇原创文章 · 获赞 144 · 访问量 32万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章