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 let "1<2" returns 0 (as "1<2" expands to "1") 2 (( 0 && 1 )) returns 1 (as "0 && 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 if cmp a b &> /dev/null # 禁止输出. 2 then echo "Files a and b are identical." 3 else echo "Files a and b differ." 4 fi 5 6 # 非常有用的"if-grep"结构: 7 # ------------------------ 8 if grep -q Bash file 9 then echo "File contains at least one occurrence of Bash." 10 fi 11 12 word=Linux 13 letter_sequence=inu 14 if echo "$word" | grep -q "$letter_sequence" 15 # "-q" 选项是用来禁止输出的. 16 then 17 echo "$letter_sequence found in $word" 18 else 19 echo "$letter_sequence not found in $word" 20 fi 21 22 23 if COMMAND_WHOSE_EXIT_STATUS_IS_0_UNLESS_ERROR_OCCURRED 24 then echo "Command succeeded." 25 else echo "Command failed." 26 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 if echo "Next *if* is part of the comparison for the first *if*." 2 3 if [[ $comparison = "integer" ]] 4 then (( a < b )) 5 else 6 [[ $a < $b ]] 7 fi 8 9 then 10 echo '$a is less than $b' 11 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 #!/bin/bash 2 3 # 小技巧: 4 # 如果你不能够确定一个特定的条件该如何进行判断, 5 #+ 那么就使用if-test结构. 6 7 echo 8 9 echo "Testing \"0\"" 10 if [ 0 ] # zero 11 then 12 echo "0 is true." 13 else 14 echo "0 is false." 15 fi # 0 为真. 16 17 echo 18 19 echo "Testing \"1\"" 20 if [ 1 ] # one 21 then 22 echo "1 is true." 23 else 24 echo "1 is false." 25 fi # 1 为真. 26 27 echo 28 29 echo "Testing \"-1\"" 30 if [ -1 ] # 负1 31 then 32 echo "-1 is true." 33 else 34 echo "-1 is false." 35 fi # -1 为真. 36 37 echo 38 39 echo "Testing \"NULL\"" 40 if [ ] # NULL (空状态) 41 then 42 echo "NULL is true." 43 else 44 echo "NULL is false." 45 fi # NULL 为假. 46 47 echo 48 49 echo "Testing \"xyz\"" 50 if [ xyz ] # 字符串 51 then 52 echo "Random string is true." 53 else 54 echo "Random string is false." 55 fi # 随便的一串字符为真. 56 57 echo 58 59 echo "Testing \"\$xyz\"" 60 if [ $xyz ] # 判断$xyz是否为null, 但是... 61 # 这只是一个未初始化的变量. 62 then 63 echo "Uninitialized variable is true." 64 else 65 echo "Uninitialized variable is false." 66 fi # 未定义的初始化为假. 67 68 echo 69 70 echo "Testing \"-n \$xyz\"" 71 if [ -n "$xyz" ] # 更加正规的条件检查. 72 then 73 echo "Uninitialized variable is true." 74 else 75 echo "Uninitialized variable is false." 76 fi # 未初始化的变量为假. 77 78 echo 79 80 81 xyz= # 初始化了, 但是赋null值. 82 83 echo "Testing \"-n \$xyz\"" 84 if [ -n "$xyz" ] 85 then 86 echo "Null variable is true." 87 else 88 echo "Null variable is false." 89 fi # null变量为假. 90 91 92 echo 93 94 95 # 什么时候"false"为真? 96 97 echo "Testing \"false\"" 98 if [ "false" ] # 看起来"false"只不过是一个字符串而已. 99 then100 echo "\"false\" is true." #+ 并且条件判断的结果为真.101 else102 echo "\"false\" is false."103 fi # "false" 为真.104 105 echo106 107 echo "Testing \"\$false\"" # 再来一个, 未初始化的变量.108 if [ "$false" ]109 then110 echo "\"\$false\" is true."111 else112 echo "\"\$false\" is false."113 fi # "$false" 为假.114 # 现在, 我们得到了预期的结果.115 116 # 如果我们测试以下为初始化的变量"$true"会发生什么呢?117 118 echo119 120 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 if [ condition-true ] 2 then 3 command 1 4 command 2 5 ... 6 else 7 # 可选的(如果不需要可以省去). 8 # 如果原始的条件判断的结果为假, 那么在这里添加默认的代码块来执行. 9 command 3 10 command 4 11 ... 12 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 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 if [ condition1 ] 2 then 3 command1 4 command2 5 command3 6 elif [ condition2 ] 7 # 与else if一样 8 then 9 command4 10 command5 11 else 12 default-command 13 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 + -
显示快捷键?