testconstructs.html

来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 1,203 行 · 第 1/2 页

HTML
1,203
字号
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>条件测试结构</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="条件判断"HREF="tests.html"><LINKREL="PREVIOUS"TITLE="条件判断"HREF="tests.html"><LINKREL="NEXT"TITLE="文件测试操作符"HREF="fto.html"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="tests.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">7. 条件判断</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="fto.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="TESTCONSTRUCTS">7.1. 条件测试结构</A></H1><P><ANAME="TESTCONSTRUCTS1"></A></P><P></P><UL><LI><P><BCLASS="COMMAND">if/then</B>结构用来判断命令列表的<AHREF="exit-status.html#EXITSTATUSREF">退出状态码</A>是否为<SPANCLASS="RETURNVALUE">0</SPAN>(因为在UNIX惯例, 0表示<SPANCLASS="QUOTE">"成功"</SPAN>), 			如果成功的话, 那么就执行接下来的一个或多个命令.	</P></LI><LI><P>有一个专有命令<BCLASS="COMMAND">[</B> (<AHREF="special-chars.html#LEFTBRACKET">左中括号</A>, 特殊字符). 			这个命令与<BCLASS="COMMAND">test</B>命令等价,			并且出于效率上的考虑, 这是一个<AHREF="internal.html#BUILTINREF">内建</A>命令. 			这个命令把它的参数作为比较表达式或者作为文件测试, 			并且根据比较的结果来返回一个退出状态码(0 表示真, 1表示假). </P></LI><LI><P>在版本2.02的Bash中, 引入了<AHREF="testconstructs.html#DBLBRACKETS">[[ ... ]]</A><EM>扩展测试命令</EM>, 		因为这种表现形式可能对某些语言的程序员来说更容易熟悉一些. 		注意<BCLASS="COMMAND">[[</B>是一个<AHREF="internal.html#KEYWORDREF">关键字</A>, 并不是一个命令.</P><P>Bash把<KBDCLASS="USERINPUT">[[ $a -lt $b ]]</KBD>看作一个单独的元素, 		并且返回一个退出状态码.</P><P><AHREF="dblparens.html">(( ... ))</A>和<AHREF="internal.html#LETREF">let ...</A>结构也能够返回退出状态码, 	  当它们所测试的算术表达式的结果为非零的时候, 将会返回退出状态码<SPANCLASS="RETURNVALUE">0</SPAN>. 	  这些<AHREF="arithexp.html#ARITHEXPREF">算术扩展</A>结构被用来做算术比较. 	    <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;let "1&#60;2" returns 0 (as "1&#60;2" expands to "1")  2&nbsp;(( 0 &#38;&#38; 1 )) returns 1 (as "0 &#38;&#38; 1" expands to "0")</PRE></FONT></TD></TR></TABLE>	    	  </P></LI><LI><P><ANAME="IFGREPREF"></A></P><P><BCLASS="COMMAND">if</B>命令能够测试任何命令, 并不仅仅是中括号中的条件. 	      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;if cmp a b &#38;&#62; /dev/null  # 禁止输出.  2&nbsp;then echo "Files a and b are identical."  3&nbsp;else echo "Files a and b differ."  4&nbsp;fi  5&nbsp;  6&nbsp;# 非常有用的"if-grep"结构:  7&nbsp;# ------------------------  8&nbsp;if grep -q Bash file  9&nbsp;then echo "File contains at least one occurrence of Bash." 10&nbsp;fi 11&nbsp; 12&nbsp;word=Linux 13&nbsp;letter_sequence=inu 14&nbsp;if echo "$word" | grep -q "$letter_sequence" 15&nbsp;# "-q" 选项是用来禁止输出的. 16&nbsp;then 17&nbsp;  echo "$letter_sequence found in $word" 18&nbsp;else 19&nbsp;  echo "$letter_sequence not found in $word" 20&nbsp;fi 21&nbsp; 22&nbsp; 23&nbsp;if COMMAND_WHOSE_EXIT_STATUS_IS_0_UNLESS_ERROR_OCCURRED 24&nbsp;then echo "Command succeeded." 25&nbsp;else echo "Command failed." 26&nbsp;fi</PRE></FONT></TD></TR></TABLE>          </P></LI><LI><P>一个<BCLASS="COMMAND">if/then</B>结构可以包含嵌套的比较操作和条件判断操作. 	      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;if echo "Next *if* is part of the comparison for the first *if*."  2&nbsp;  3&nbsp;  if [[ $comparison = "integer" ]]  4&nbsp;    then (( a &#60; b ))  5&nbsp;  else  6&nbsp;    [[ $a &#60; $b ]]  7&nbsp;  fi  8&nbsp;  9&nbsp;then 10&nbsp;  echo '$a is less than $b' 11&nbsp;fi</PRE></FONT></TD></TR></TABLE>          </P><P><EM>谦虚的Stephane Chazelas解释了<SPANCLASS="QUOTE">"if-test"</SPAN>的详细细节.</EM></P></LI></UL><DIVCLASS="EXAMPLE"><HR><ANAME="EX10"></A><P><B>例子 7-1. 什么是真?</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;  3&nbsp;#  小技巧:  4&nbsp;#  如果你不能够确定一个特定的条件该如何进行判断,  5&nbsp;#+ 那么就使用if-test结构.   6&nbsp;  7&nbsp;echo  8&nbsp;  9&nbsp;echo "Testing \"0\"" 10&nbsp;if [ 0 ]      # zero 11&nbsp;then 12&nbsp;  echo "0 is true." 13&nbsp;else 14&nbsp;  echo "0 is false." 15&nbsp;fi            # 0 为真. 16&nbsp; 17&nbsp;echo 18&nbsp; 19&nbsp;echo "Testing \"1\"" 20&nbsp;if [ 1 ]      # one 21&nbsp;then 22&nbsp;  echo "1 is true." 23&nbsp;else 24&nbsp;  echo "1 is false." 25&nbsp;fi            # 1 为真. 26&nbsp; 27&nbsp;echo 28&nbsp; 29&nbsp;echo "Testing \"-1\"" 30&nbsp;if [ -1 ]     # 负1 31&nbsp;then 32&nbsp;  echo "-1 is true." 33&nbsp;else 34&nbsp;  echo "-1 is false." 35&nbsp;fi            # -1 为真. 36&nbsp; 37&nbsp;echo 38&nbsp; 39&nbsp;echo "Testing \"NULL\"" 40&nbsp;if [ ]        # NULL (空状态) 41&nbsp;then 42&nbsp;  echo "NULL is true." 43&nbsp;else 44&nbsp;  echo "NULL is false." 45&nbsp;fi            # NULL 为假. 46&nbsp; 47&nbsp;echo 48&nbsp; 49&nbsp;echo "Testing \"xyz\"" 50&nbsp;if [ xyz ]    # 字符串 51&nbsp;then 52&nbsp;  echo "Random string is true." 53&nbsp;else 54&nbsp;  echo "Random string is false." 55&nbsp;fi            # 随便的一串字符为真. 56&nbsp; 57&nbsp;echo 58&nbsp; 59&nbsp;echo "Testing \"\$xyz\"" 60&nbsp;if [ $xyz ]   # 判断$xyz是否为null, 但是... 61&nbsp;              # 这只是一个未初始化的变量. 62&nbsp;then 63&nbsp;  echo "Uninitialized variable is true." 64&nbsp;else 65&nbsp;  echo "Uninitialized variable is false." 66&nbsp;fi            # 未定义的初始化为假. 67&nbsp; 68&nbsp;echo 69&nbsp; 70&nbsp;echo "Testing \"-n \$xyz\"" 71&nbsp;if [ -n "$xyz" ]            # 更加正规的条件检查. 72&nbsp;then 73&nbsp;  echo "Uninitialized variable is true." 74&nbsp;else 75&nbsp;  echo "Uninitialized variable is false." 76&nbsp;fi            # 未初始化的变量为假. 77&nbsp; 78&nbsp;echo 79&nbsp; 80&nbsp; 81&nbsp;xyz=          # 初始化了, 但是赋null值. 82&nbsp; 83&nbsp;echo "Testing \"-n \$xyz\"" 84&nbsp;if [ -n "$xyz" ] 85&nbsp;then 86&nbsp;  echo "Null variable is true." 87&nbsp;else 88&nbsp;  echo "Null variable is false." 89&nbsp;fi            # null变量为假.  90&nbsp; 91&nbsp; 92&nbsp;echo 93&nbsp; 94&nbsp; 95&nbsp;# 什么时候"false"为真? 96&nbsp; 97&nbsp;echo "Testing \"false\"" 98&nbsp;if [ "false" ]              #  看起来"false"只不过是一个字符串而已.  99&nbsp;then100&nbsp;  echo "\"false\" is true." #+ 并且条件判断的结果为真.101&nbsp;else102&nbsp;  echo "\"false\" is false."103&nbsp;fi            # "false" 为真.104&nbsp;105&nbsp;echo106&nbsp;107&nbsp;echo "Testing \"\$false\""  # 再来一个, 未初始化的变量.108&nbsp;if [ "$false" ]109&nbsp;then110&nbsp;  echo "\"\$false\" is true."111&nbsp;else112&nbsp;  echo "\"\$false\" is false."113&nbsp;fi            # "$false" 为假.114&nbsp;              # 现在, 我们得到了预期的结果.115&nbsp;116&nbsp;#  如果我们测试以下为初始化的变量"$true"会发生什么呢?117&nbsp;118&nbsp;echo119&nbsp;120&nbsp;exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><DIVCLASS="FORMALPARA"><P><B>练习. </B>解释上边的<AHREF="testconstructs.html#EX10">例子 7-1</A>的行为. </P></DIV><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;if [ condition-true ]  2&nbsp;then  3&nbsp;   command 1  4&nbsp;   command 2  5&nbsp;   ...  6&nbsp;else  7&nbsp;   # 可选的(如果不需要可以省去).  8&nbsp;   # 如果原始的条件判断的结果为假, 那么在这里添加默认的代码块来执行.  9&nbsp;   command 3 10&nbsp;   command 4 11&nbsp;   ... 12&nbsp;fi</PRE></FONT></TD></TR></TABLE>      </P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>如果<EM>if</EM>和<EM>then</EM>在条件判断的同一行上的话, 			  必须使用分号来结束<EM>if</EM>表达式. 			  <EM>if</EM>和<EM>then</EM>都是<AHREF="internal.html#KEYWORDREF">关键字</A>. 关键字(或者命令)如果作为表达式的开头, 			  并且如果想在同一行上再写一个新的表达式的话, 	那么必须使用分号来结束上一句表达式.</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;if [ -x "$filename" ]; then</PRE></FONT></TD></TR></TABLE></P></TD></TR></TABLE></DIV><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="ELIFREF1"></A>Else if和elif</B></P><DL><DT><SPANCLASS="TOKEN">elif</SPAN></DT><DD><P><KBDCLASS="USERINPUT">elif</KBD>是<SPANCLASS="TOKEN">else if</SPAN>的缩写形式. 			 作用是在外部的判断结构中再嵌入一个内部的<SPANCLASS="TOKEN">if/then</SPAN>结构. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;if [ condition1 ]  2&nbsp;then  3&nbsp;   command1  4&nbsp;   command2  5&nbsp;   command3  6&nbsp;elif [ condition2 ]  7&nbsp;# 与else if一样  8&nbsp;then  9&nbsp;   command4 10&nbsp;   command5 11&nbsp;else 12&nbsp;   default-command 13&nbsp;fi</PRE></FONT></TD></TR></TABLE>	      </P></DD></DL></DIV><P>                                    		<KBDCLASS="USERINPUT">if test condition-true</KBD>结构与<KBDCLASS="USERINPUT">if [ condition-true ]</KBD>完全相同.	就像我们前面所看到的, 左中括号, <BCLASS="COMMAND"

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?