BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版
源代码在线查看: exit-status.html
> > >退出和退出状态码 > NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"> REL="HOME" TITLE="高级Bash脚本编程指南" HREF="index.html"> REL="UP" TITLE="基本" HREF="part2.html"> REL="PREVIOUS" TITLE="转义" HREF="escapingsection.html"> REL="NEXT" TITLE="条件判断" HREF="tests.html"> > CLASS="CHAPTER" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" > CLASS="NAVHEADER" > SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" > > COLSPAN="3" ALIGN="center" >高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍 > > > WIDTH="10%" ALIGN="left" VALIGN="bottom" > HREF="escapingsection.html" ACCESSKEY="P" >前一页 > > WIDTH="80%" ALIGN="center" VALIGN="bottom" > > WIDTH="10%" ALIGN="right" VALIGN="bottom" > HREF="tests.html" ACCESSKEY="N" >下一页 > > > > ALIGN="LEFT" WIDTH="100%"> > CLASS="CHAPTER" > > NAME="EXIT-STATUS" > >6. 退出和退出状态码 > BORDER="0" WIDTH="100%" CELLSPACING="0" CELLPADDING="0" CLASS="EPIGRAPH" > > WIDTH="45%" > > WIDTH="45%" ALIGN="LEFT" VALIGN="TOP" > > > >...在Bourne shell中有许多黑暗的角落, 但是人们也会利用它们. > > > > > > WIDTH="45%" > > WIDTH="45%" ALIGN="RIGHT" VALIGN="TOP" > > CLASS="ATTRIBUTION" >Chet Ramey > > > > > > NAME="EXITCOMMANDREF" > > CLASS="COMMAND" > exit > 被用来结束一个脚本, 就像在 >C >语言中一样. 它也返回一个值, 并且这个值会传递给脚本的父进程, 父进程会使用这个值做下一步的处理. > > NAME="EXITSTATUSREF" > >每个命令都会返回一个 CLASS="FIRSTTERM" > 退出状态码 > (有时候也被称为 CLASS="FIRSTTERM" > 返回状态 >). 成功的命令返回 CLASS="RETURNVALUE" >0 >, 而不成功的命令返回 CLASS="RETURNVALUE" >非零 >值, 非零值通常都被解释成一个错误码. 行为良好的UNIX命令, 程序, 和工具都会返回 CLASS="RETURNVALUE" >0 >作为退出码来表示成功, 虽然偶尔也会有例外. > >同样的, 脚本中的函数和脚本本身也会返回退出状态码. 在脚本或者是脚本函数中执行的最后的命令会决定退出状态码. 在脚本中, CLASS="USERINPUT" >exit CLASS="REPLACEABLE" > >nnn > > >命令将会把 CLASS="RETURNVALUE" > CLASS="REPLACEABLE" > >nnn > > >退出码传递给shell( CLASS="RETURNVALUE" > CLASS="REPLACEABLE" > >nnn > > >必须是十进制数, 范围必须是 CLASS="RETURNVALUE" >0 > - CLASS="RETURNVALUE" >255 >). > CLASS="NOTE" > > > CLASS="NOTE" WIDTH="100%" BORDER="0" > > WIDTH="25" ALIGN="CENTER" VALIGN="TOP" > SRC="./images/note.gif" HSPACE="5" ALT="Note"> > ALIGN="LEFT" VALIGN="TOP" > >当脚本以不带参数的 CLASS="COMMAND" >exit >命令来结束时, 脚本的退出状态码就由脚本中最后执行的命令来决定(就是 CLASS="COMMAND" >exit >之前的命令). > > BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" > > > COLOR="#000000" > CLASS="PROGRAMLISTING" > 1 #!/bin/bash 2 3 COMMAND_1 4 5 . . . 6 7 # 将以最后的命令来决定退出状态码. 8 COMMAND_LAST 9 10 exit > > > > > > >不带参数的 CLASS="COMMAND" >exit >命令与 CLASS="COMMAND" >exit $? >的效果是一样的, 甚至脚本的结尾不写 CLASS="COMMAND" >exit >, 也与前两者的效果相同. > > BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" > > > COLOR="#000000" > CLASS="PROGRAMLISTING" > 1 #!/bin/bash 2 3 COMMAND_1 4 5 . . . 6 7 # 将以最后的命令来决定退出状态码. 8 COMMAND_LAST 9 10 exit $? > > > > > > > BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" > > > COLOR="#000000" > CLASS="PROGRAMLISTING" > 1 #!/bin/bash 2 3 COMMAND1 4 5 . . . 6 7 # 将以最后的命令来决定退出状态码. 8 COMMAND_LAST > > > > > > > > > > > NAME="EXSREF" > > > > CLASS="VARNAME" > $? >保存了最后所执行的命令的退出状态码. 当函数返回之后, CLASS="VARNAME" >$? >保存函数中最后所执行的命令的退出状态码. 这就是bash对函数 CLASS="QUOTE" >"返回值" >的处理方法. 当一个脚本退出, CLASS="VARNAME" >$? >保存了脚本的退出状态码, 这个退出状态码也就是脚本中最后一个执行命令的退出状态码. 一般情况下, CLASS="USERINPUT" >0 >表示成功, 在范围 CLASS="RETURNVALUE" >1 - 255 >的整数表示错误. > CLASS="EXAMPLE" > NAME="EX5" > > > >例子 6-1. 退出/退出状态码 > > BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" > > > COLOR="#000000" > CLASS="PROGRAMLISTING" > 1 #!/bin/bash 2 3 echo hello 4 echo $? # 退出状态为0, 因为命令执行成功. 5 6 lskdf # 无效命令. 7 echo $? # 非零的退出状态, 因为命令执行失败. 8 9 echo 10 11 exit 113 # 返回113退出状态给shell. 12 # 为了验证这个结果, 可以在脚本结束的地方使用"echo $?". 13 14 # 一般的, 'exit 0' 表示成功, 15 #+ 而一个非零的退出码表示一个错误, 或者是反常的条件. > > > > > > > HREF="internalvariables.html#XSTATVARREF" >$? >用于测试脚本中的命令结果的时候, 往往显得特别有用(见 HREF="filearchiv.html#FILECOMP" >例子 12-32 >和 HREF="textproc.html#LOOKUP" >例子 12-17 >). > CLASS="NOTE" > > > CLASS="NOTE" WIDTH="100%" BORDER="0" > > WIDTH="25" ALIGN="CENTER" VALIGN="TOP" > SRC="./images/note.gif" HSPACE="5" ALT="Note"> > ALIGN="LEFT" VALIGN="TOP" > > HREF="special-chars.html#NOTREF" >! >, 逻辑 CLASS="QUOTE" >"非" >操作符, 将会反转命令或条件测试的结果, 并且这会影响 HREF="exit-status.html#EXITSTATUSREF" >退出状态码 >. CLASS="EXAMPLE" > NAME="NEGCOND" > > > >例子 6-2. 反转一个条件的用法 CLASS="TOKEN" >! > > > BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" > > > COLOR="#000000" > CLASS="PROGRAMLISTING" > 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. > > > > > > > > > > > CLASS="CAUTION" > > > CLASS="CAUTION" WIDTH="100%" BORDER="0" > > WIDTH="25" ALIGN="CENTER" VALIGN="TOP" > SRC="./images/caution.gif" HSPACE="5" ALT="Caution"> > ALIGN="LEFT" VALIGN="TOP" > >特定的退出状态码具有 HREF="exitcodes.html#EXITCODESREF" >保留含义 >, 所以用户不应该在脚本中指定它. > > > > > > CLASS="NAVFOOTER" > ALIGN="LEFT" WIDTH="100%"> SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" > > WIDTH="33%" ALIGN="left" VALIGN="top" > HREF="escapingsection.html" ACCESSKEY="P" >前一页 > > WIDTH="34%" ALIGN="center" VALIGN="top" > HREF="index.html" ACCESSKEY="H" >首页 > > WIDTH="33%" ALIGN="right" VALIGN="top" > HREF="tests.html" ACCESSKEY="N" >下一页 > > > > WIDTH="33%" ALIGN="left" VALIGN="top" >转义 > WIDTH="34%" ALIGN="center" VALIGN="top" > HREF="part2.html" ACCESSKEY="U" >上一级 > > WIDTH="33%" ALIGN="right" VALIGN="top" >条件判断 > > > > > >