<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/624e5c76fc37f87c24e197fe/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624e5c76fc37f87c24e197fe/bg1.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x2 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">下载</div><div class="t m0 x3 h4 y3 ff2 fs0 fc1 sc0 ls0 ws0">第<span class="ff3">18</span>章<span class="_ _0"> </span>控制流结构</div><div class="t m0 x4 h5 y4 ff2 fs1 fc0 sc0 ls1 ws0">所有功能脚本必须有能力进行判断,也必须有能力基于一定条件处理相关命令。本章讲</div><div class="t m0 x5 h5 y5 ff2 fs1 fc0 sc0 ls2 ws0">述这方面的功能,在脚本中创建和应用控制结构。</div><div class="t m0 x4 h5 y6 ff2 fs1 fc0 sc0 ls3 ws0">本章内容有:</div><div class="t m0 x4 h6 y7 ff3 fs1 fc0 sc0 ls0 ws0">• <span class="_ _1"></span><span class="ff2">退出状态。</span></div><div class="t m0 x4 h6 y8 ff3 fs1 fc0 sc0 ls4 ws0">• while<span class="_ _1"></span><span class="ff2 ls0">、<span class="ff3 ws1">f o r</span>和<span class="_ _1"></span></span><span class="ls5">until loops<span class="ff2 ls0">循环。</span></span></div><div class="t m0 x4 h6 y9 ff3 fs1 fc0 sc0 ls6 ws0">• if then else<span class="ff2 ls0">语句。</span></div><div class="t m0 x4 h6 ya ff3 fs1 fc0 sc0 ls0 ws0">• <span class="_ _1"></span><span class="ff2 ls3">脚本中动作。</span></div><div class="t m0 x4 h6 yb ff3 fs1 fc0 sc0 ls0 ws0">• <span class="_ _1"></span><span class="ff2">菜单。</span></div><div class="t m0 x5 h7 yc ff4 fs2 fc1 sc0 ls0 ws0">18.1 <span class="ff5">退出状态</span></div><div class="t m0 x4 h5 yd ff2 fs1 fc0 sc0 ls1 ws0">在书写正确脚本前,大概讲一下退出状态。任何命令进行时都将返回一个退出状态。如</div><div class="t m0 x5 h5 ye ff2 fs1 fc0 sc0 ls7 ws0">果要观察其退出状态,使用最后状态命令:</div><div class="t m0 x4 h8 yf ff6 fs3 fc0 sc0 ls8 ws0">$ echo $?</div><div class="t m0 x4 h6 y10 ff2 fs1 fc0 sc0 ls0 ws0">主要有<span class="_ _1"></span><span class="ff3">4<span class="_ _1"></span></span><span class="ls9">种退出状态。前面已经讲到了两种,即最后命令退出状态<span class="_ _2"> </span></span><span class="ff3 ws1">$ ?</span>和控制次序命令(<span class="_ _3"></span><span class="ff3 ws1">$ $</span>、</div><div class="t m0 x5 h6 y11 ff3 fs1 fc0 sc0 ls0 ws2">| |<span class="_"> </span><span class="ff2 ws0">)<span class="_ _4"></span><span class="lsa">。其余两种是处理<span class="_ _3"> </span><span class="ff3 ls0 ws2">s h e l l<span class="_ _5"></span></span><span class="ls0">脚本或<span class="_ _3"></span><span class="ff3 ws2">s h e l l</span><span class="lsb">退出及相应退出状态或函数返回码。在第<span class="_ _6"> </span></span><span class="ff3 ws2">1 9<span class="_ _1"></span></span><span class="lsc">章讲到函数</span></span></span></span></div><div class="t m0 x5 h5 y12 ff2 fs1 fc0 sc0 lsd ws0">时,也将提到其返回码。</div><div class="t m0 x4 h6 y13 ff2 fs1 fc0 sc0 lse ws0">要退出当前进程,<span class="_ _5"></span><span class="ff3 ls0 ws1">s h e l l</span><span class="ls0">提供命令<span class="_ _5"></span><span class="ff3 ws1">e x i t<span class="_"> </span></span><span class="lsf">,一般格式为:</span></span></div><div class="t m0 x4 h8 y14 ff6 fs3 fc0 sc0 ls10 ws0">exit n</div><div class="t m0 x4 h6 y15 ff2 fs1 fc0 sc0 ls0 ws0">其中,<span class="_ _1"></span><span class="ff3">n<span class="_ _1"></span></span>为一数字。</div><div class="t m0 x4 h6 y16 ff2 fs1 fc0 sc0 ls11 ws0">如果只在命令提示符下键入<span class="_ _3"> </span><span class="ff3 ls0 ws1">e x i t<span class="_"> </span></span><span class="ls12">,假定没有在当前状态创建另一个<span class="_ _3"> </span><span class="ff3 ls0 ws1">s h e l l<span class="_ _1"></span></span><span class="ls0">,将退出当前<span class="_ _1"></span><span class="ff3 ws1">s h e l l</span>。</span></span></div><div class="t m0 x5 h6 y17 ff2 fs1 fc0 sc0 ls13 ws0">如果在脚本中键入<span class="_ _3"></span><span class="ff3 ls0 ws3">e x i t<span class="_"> </span></span><span class="ls0">,<span class="_ _1"></span><span class="ff3 ws3">s h e l l</span><span class="ls14">将试图(通常是这样)返回上一个命令返回值。有许多退出脚本</span></span></div><div class="t m0 x5 h5 y18 ff2 fs1 fc0 sc0 ls15 ws0">值,但其中相对于脚本和一般系统命令最重要的有两种,即:</div><div class="t m0 x4 h6 y19 ff2 fs1 fc0 sc0 ls0 ws0">退出状态<span class="_ _5"></span><span class="ff3">0 <span class="_ _5"></span></span><span class="ls16">退出成功,无错误。</span></div><div class="t m0 x4 h6 y1a ff2 fs1 fc0 sc0 ls0 ws0">退出状态<span class="_ _5"></span><span class="ff3">1 <span class="_ _5"></span></span><span class="lsd">退出失败,某处有错误。</span></div><div class="t m0 x4 h6 y1b ff2 fs1 fc0 sc0 ls0 ws0">可以在<span class="_ _5"></span><span class="ff3 ws4">s h e l l<span class="_"> </span></span><span class="ls17">脚本中加入自己的退出状态(它将退出脚本)<span class="_ _7"></span><span class="ls18">。本书鼓励这样做,因为另一个</span></span></div><div class="t m0 x5 h6 y1c ff3 fs1 fc0 sc0 ls0 ws5">s h e l l<span class="_ _1"></span><span class="ff2 ls19 ws0">脚本或返回函数可能要从<span class="_ _8"> </span></span>s h e l l<span class="ff2 ls1a ws0">脚本中抽取退出脚本。另外,相信加入脚本本身的退出脚</span></div><div class="t m0 x5 h5 y1d ff2 fs1 fc0 sc0 ls1b ws0">本值是一种好的编程习惯。</div><div class="t m0 x4 h5 y1e ff2 fs1 fc0 sc0 ls1 ws0">如果愿意,用户可以在一个用户输入错误后或一个不可覆盖错误后或正常地处理结束后</div><div class="t m0 x5 h5 y1f ff2 fs1 fc0 sc0 ls0 ws0">退出脚本。</div><div class="t m0 x4 h5 y20 ff5 fs1 fc0 sc0 ls0 ws0">注意<span class="_ _9"> </span><span class="ff1 ls1c">从现在起,本书所有脚本都将加入注释行。注释行将解释脚本具体含义,帮助用户</span></div><div class="t m0 x4 h6 y21 ff1 fs1 fc0 sc0 ls1d ws0">理解脚本。可以在任何地方加入注释行,因为其本身被解释器忽略。注释行应以<span class="_ _4"></span><span class="ff3">#<span class="ff1 ls0">开头。</span></span></div><div class="t m0 x5 h7 y22 ff4 fs2 fc1 sc0 ls0 ws0">18.2 <span class="ff5">控制结构</span></div><div class="t m0 x4 h5 y23 ff2 fs1 fc0 sc0 ls1 ws0">几乎所有的脚本里都有某种流控制结构,很少有例外。流控制是什么?假定有一个脚本</div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>
</body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624e5c76fc37f87c24e197fe/bg2.jpg"><div class="t m0 x6 h5 y24 ff2 fs1 fc0 sc0 ls16 ws0">包含下列几个命令:</div><div class="t m0 x7 h5 y25 ff2 fs1 fc0 sc0 ls1 ws0">上述脚本问题出在哪里?如果目录创建失败或目录创建成功文件拷贝失败,如何处理?</div><div class="t m0 x6 h5 y26 ff2 fs1 fc0 sc0 ls1e ws0">这里需要从不同的目录中拷贝不同的文件。必须在命令执行前或最后的命令退出前决定处理</div><div class="t m0 x6 h6 y27 ff2 fs1 fc0 sc0 ls0 ws0">方法。<span class="_ _3"></span><span class="ff3 ws6">s h e l l</span><span class="ls1f">会提供一系列命令声明语句等补救措施来帮助你在命令成功或失败时,或需要处</span></div><div class="t m0 x6 h5 y28 ff2 fs1 fc0 sc0 ls20 ws0">理一个命令清单时采取正确的动作。</div><div class="t m0 x7 h5 y29 ff2 fs1 fc0 sc0 ls1b ws0">这些命令语句大概分两类:</div><div class="t m0 x7 h5 y2a ff2 fs1 fc0 sc0 lsf ws0">循环和流控制。</div><div class="t m0 x6 h5 y2b ff4 fs1 fc1 sc0 ls0 ws0">18.2.1 <span class="ff5">流控制</span></div><div class="t m0 x7 h6 y2c ff3 fs1 fc0 sc0 ls0 ws7">i f<span class="ff2 ws0">、<span class="_ _1"></span></span>t h e n<span class="_"> </span><span class="ff2 ws0">、<span class="_ _1"></span></span>e l s e<span class="_"> </span><span class="ff2 ls21 ws0">语句提供条件测试。测试可以基于各种条件。例如文件的权限、长度、数</span></div><div class="t m0 x6 h6 y2d ff2 fs1 fc0 sc0 ls22 ws0">值或字符串的比较。这些测试返回值或者为真(<span class="_ _a"> </span><span class="ff3">0<span class="_ _1"></span></span><span class="ls0">)<span class="_ _7"></span><span class="ls23">,或者为假(<span class="_ _3"> </span><span class="ff3">1<span class="_ _1"></span></span><span class="ls0">)<span class="_ _7"></span><span class="ls24">。基于此结果,可以进行</span></span></span></span></div><div class="t m0 x6 h5 y2e ff2 fs1 fc0 sc0 ls25 ws0">相关操作。在讲到条件测试时已经涉及了一些测试语法。</div><div class="t m0 x7 h6 y2f ff3 fs1 fc0 sc0 ls0 ws8">c a s e<span class="ff2 ls5 ws0">语句允许匹配模式、单词或值。一旦模式或值匹配,就可以基于这个匹配条件作其他</span></div><div class="t m0 x6 h5 y30 ff2 fs1 fc0 sc0 ls0 ws0">声明。</div><div class="t m0 x6 h5 y31 ff4 fs1 fc1 sc0 ls0 ws0">18.2.2 <span class="ff5">循环</span></div><div class="t m0 x7 h6 y32 ff2 fs1 fc0 sc0 ls25 ws0">循环或跳转是一系列命令的重复执行过程,本书提到了<span class="_ _8"> </span><span class="ff3">3<span class="_ _1"></span></span><span class="ls3">种循环语句:</span></div><div class="t m0 x7 h6 y33 ff3 fs1 fc0 sc0 ls0 ws0">for <span class="_ _5"></span><span class="ff2">循环<span class="_ _b"> </span><span class="ls7">每次处理依次列表内信息,直至循环耗尽。</span></span></div><div class="t m0 x7 h6 y34 ff3 fs1 fc0 sc0 ls0 ws0">Until <span class="_ _c"></span><span class="ff2">循环<span class="_ _d"> </span><span class="ls26">此循环语句不常使用,<span class="_ _c"></span></span></span><span class="ws1">u n t i l<span class="_"> </span></span><span class="ff2 ls27">循环直至条件为真。条件部分在循环末尾部分。</span></div><div class="t m0 x7 h6 y35 ff3 fs1 fc0 sc0 ls0 ws0">While <span class="_ _c"></span><span class="ff2">循环<span class="_ _e"> </span></span><span class="ws1">w h i l e</span><span class="ff2 ls2">循环当条件为真时,循环执行,条件部分在循环头。</span></div><div class="t m0 x7 h6 y36 ff2 fs1 fc0 sc0 ls25 ws0">流控制语句的任何循环均可嵌套使用,例如可以在一个<span class="_ _8"> </span><span class="ff3 ls0 ws1">f o r<span class="_"> </span></span><span class="lse">循环中嵌入另一个<span class="_ _c"></span><span class="ff3 ls0 ws1">f o r<span class="_"> </span></span><span class="ls0">循环。</span></span></div><div class="t m0 x7 h5 y37 ff2 fs1 fc0 sc0 ls2 ws0">现在开始讲解循环和控制流,并举一些脚本实例。</div><div class="t m0 x7 h6 y38 ff2 fs1 fc0 sc0 lsa ws0">从现在起,脚本中<span class="_ _f"> </span><span class="ff3 ls0 ws9">e c h o<span class="_"> </span></span><span class="ls28">语句使用<span class="_ _5"></span><span class="ff3 ls0 ws9">L I N U X<span class="_"> </span></span><span class="ls0">或<span class="_ _1"></span><span class="ff3 ws9">B S D<span class="_"> </span></span><span class="ls29">版本,也就是说使用<span class="_ _2"> </span></span><span class="ff3 ws9">e c h o<span class="_"> </span></span>方法<span class="_ _5"></span><span class="ff3 ls2a">echo -e -n</span>,</span></span></div><div class="t m0 x6 h6 y39 ff2 fs1 fc0 sc0 ls0 ws0">意即从<span class="_ _c"></span><span class="ff3 wsa">e c h o<span class="_"> </span></span><span class="ls2b">结尾中下一行执行命令。应用于<span class="_ _8"> </span></span><span class="ff3 wsa">U N I X</span>(系统<span class="_ _c"></span><span class="ff3">V<span class="_ _1"></span></span>和<span class="_ _1"></span><span class="ff3 wsa">B S D</span><span class="ls2c">)的统一的<span class="_ _c"></span></span><span class="ff3 wsa">e c h o<span class="_ _1"></span></span>命令参阅<span class="_ _3"> </span><span class="ff3 wsa">1 9</span></div><div class="t m0 x6 h6 y3a ff2 fs1 fc0 sc0 ls0 ws0">章<span class="_ _10"></span><span class="ff3 ws1">s h e l l<span class="_"> </span></span>函数。</div><div class="t m0 x6 h7 y3b ff4 fs2 fc1 sc0 ls0 ws0">18.3 if then else<span class="ff5">语句</span></div><div class="t m0 x7 h6 y3c ff3 fs1 fc0 sc0 ls0 wsb">i f<span class="ff2 ls2d ws0">语句测试条件,测试条件返回真(<span class="_ _11"> </span><span class="ff3">0</span><span class="ls28">)或假(<span class="_ _5"></span><span class="ff3">1<span class="_ _10"></span></span><span class="ls2e">)后,可相应执行一系列语句。<span class="_ _8"> </span></span></span></span>i f<span class="_"> </span><span class="ff2 ws0">语句结</span></div><div class="t m0 x6 h5 y3d ff2 fs1 fc0 sc0 ls2f ws0">构对错误检查非常有用。其格式为:</div><div class="t m0 x7 h6 y3e ff3 fs1 fc0 sc0 ls0 ws0">if <span class="_ _5"></span><span class="ff2">条件<span class="_ _1"></span></span>1</div><div class="t m0 x8 h6 y3f ff3 fs1 fc0 sc0 ls30 ws0">then <span class="ff2 ls0">命令<span class="_ _1"></span><span class="ff3">1</span></span></div><div class="t m0 x9 h6 y40 ff3 fs1 fc0 sc0 ls30 ws0">elif <span class="ff2 ls0">条件<span class="_ _1"></span><span class="ff3">2</span></span></div><div class="t m0 x7 h6 y41 ff3 fs1 fc0 sc0 ls4 ws0">then <span class="ff2 ls0">命令<span class="_ _1"></span><span class="ff3">2</span></span></div><div class="t m0 x7 h6 y42 ff3 fs1 fc0 sc0 ls4 ws0">else <span class="ff2 ls0">命令<span class="_ _1"></span><span class="ff3">3</span></span></div><div class="t m0 xa h9 y43 ff7 fs1 fc0 sc0 ls0 ws0">第<span class="ff8">18</span>章<span class="_ _12"> </span>控制流结构<span class="_ _13"> </span><span class="ff9 fs4 fc2">161</span></div><div class="c x1 y1 w2 h2"><div class="t m0 xb h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">下载</div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624e5c76fc37f87c24e197fe/bg3.jpg"><div class="t m0 xc h6 y44 ff3 fs1 fc0 sc0 ls0 ws1">f i</div><div class="t m0 xc h6 y45 ff2 fs1 fc0 sc0 lse ws0">让我们来具体讲解<span class="_ _5"></span><span class="ff3 ls0 ws1">i f<span class="_"> </span></span><span class="ls31">语句的各部分功能。</span></div><div class="t m0 xc h6 y46 ff3 fs1 fc0 sc0 ls0 ws0">If <span class="_ _1"></span><span class="ff2">条件<span class="_ _1"></span></span>1 <span class="_ _3"></span><span class="ff2">如果条件<span class="_ _5"></span></span>1<span class="_ _10"></span><span class="ff2">为真</span></div><div class="t m0 xc h6 y47 ff3 fs1 fc0 sc0 ls32 ws0">Then <span class="ff2 ls0">那么</span></div><div class="t m0 xd h6 y48 ff2 fs1 fc0 sc0 ls0 ws0">命令<span class="_ _10"></span><span class="ff3 ls33">1 <span class="_ _10"></span></span>执行命令<span class="_ _c"></span><span class="ff3">1</span></div><div class="t m0 xc h6 y49 ff3 fs1 fc0 sc0 ls4 ws0">elif <span class="ff2 ls0">条件<span class="_ _1"></span><span class="ff3">2 <span class="_ _c"></span></span>如果条件<span class="_ _c"></span><span class="ff3">1<span class="_ _10"></span></span>不成立</span></div><div class="t m0 xc h6 y4a ff3 fs1 fc0 sc0 ls34 ws0">then <span class="_ _10"></span><span class="ff2 ls0">那么</span></div><div class="t m0 xc h6 y4b ff2 fs1 fc0 sc0 ls0 ws0">命令<span class="_ _1"></span><span class="ff3 ls16">2 <span class="_ _10"></span></span>执行命令<span class="_ _5"></span><span class="ff3">2</span></div><div class="t m0 xc h6 y4c ff3 fs1 fc0 sc0 ls35 ws0">else <span class="ff2 ls0">如果条件<span class="_ _5"></span><span class="ff3">1<span class="_ _10"></span></span>,<span class="_ _10"></span><span class="ff3">2<span class="_ _10"></span></span>均不成立</span></div><div class="t m0 xd h6 y4d ff2 fs1 fc0 sc0 ls0 ws0">命令<span class="_ _10"></span><span class="ff3 ls33">3 <span class="_ _10"></span></span><span class="ls3">那么执行命令<span class="_ _5"></span><span class="ff3">3</span></span></div><div class="t m0 xc h6 y4e ff3 fs1 fc0 sc0 ls34 ws0">fi <span class="_ _10"></span><span class="ff2 ls0">完成</span></div><div class="t m0 xc h6 y4f ff3 fs1 fc0 sc0 ls0 ws1">i f<span class="ff2 lsf ws0">语句必须以单词<span class="_ _c"></span></span>f i<span class="ff2 ws0">终止。在<span class="_ _c"></span></span>i f<span class="_"> </span><span class="ff2 ws0">语句中漏写<span class="_ _c"></span></span>f i<span class="ff2 ls7 ws0">是最一般的错误。我自己有时也是这样。</span></div><div class="t m0 xc h6 y50 ff3 fs1 fc0 sc0 ls0 wsc">e l i f<span class="ff2 ws0">和<span class="_ _10"></span></span>e l s e<span class="_"> </span><span class="ff2 ls36 ws0">为可选项,如果语句中没有否则部分,那么就不需要<span class="_ _11"> </span></span>e l i f<span class="_ _1"></span><span class="ff2 ws0">和<span class="_ _10"></span></span>e l s e<span class="ff2 ws0">部分。<span class="_ _5"></span></span>I f<span class="_"> </span><span class="ff2 ws0">语句可以</span></div><div class="t m0 xe h6 y51 ff2 fs1 fc0 sc0 ls0 ws0">有许多<span class="_ _1"></span><span class="ff3 ws1">e l i f<span class="_"> </span></span><span class="lsf">部分。最常用的<span class="_ _c"></span></span><span class="ff3 ws1">i f</span>语句是<span class="_ _5"></span><span class="ff3 ls37">if then fi</span>结构。</div><div class="t m0 xc h5 y52 ff2 fs1 fc0 sc0 lse ws0">下面看一些例子。</div><div class="t m0 xe h5 y53 ff4 fs1 fc1 sc0 ls0 ws0">18.3.1 <span class="ff5">简单的</span>if<span class="ff5">语句</span></div><div class="t m0 xc h6 y54 ff2 fs1 fc0 sc0 ls0 ws0">最普通的<span class="_ _5"></span><span class="ff3 ws1">i f</span>语句是:</div><div class="t m0 xc h6 y55 ff3 fs1 fc0 sc0 ls0 ws1">i f<span class="ff2 ws0">条件</span></div><div class="t m0 xc h6 y56 ff3 fs1 fc0 sc0 ls4 ws0">then <span class="ff2 ls0">命令</span></div><div class="t m0 xc h6 y57 ff3 fs1 fc0 sc0 ls0 ws1">f i</div><div class="t m0 xc h6 y58 ff2 fs1 fc0 sc0 ls0 ws0">使用<span class="_ _1"></span><span class="ff3 wsd">i f<span class="_ _1"></span></span><span class="ls38">语句时,必须将<span class="_ _3"> </span></span><span class="ff3 wsd">t h e n<span class="_"> </span></span><span class="ls39">部分放在新行,否则会产生错误。如果要不分行,必须使用命</span></div><div class="t m0 xe h6 y59 ff2 fs1 fc0 sc0 ls25 ws0">令分隔符。本书其余部分将采取这种形式。现在简单<span class="_ _8"> </span><span class="ff3 ls0 ws1">i f<span class="_"> </span></span><span class="ls0">语句变为:</span></div><div class="t m0 xc h6 y5a ff3 fs1 fc0 sc0 ls0 ws0">if <span class="_ _5"></span><span class="ff2">条件;<span class="_ _5"></span></span><span class="ws1">t h e n</span></div><div class="t m0 xf h5 y5b ff2 fs1 fc0 sc0 ls0 ws0">命令</div><div class="t m0 xc h6 y5c ff3 fs1 fc0 sc0 ls0 ws1">f i</div><div class="t m0 xc h5 y5d ff2 fs1 fc0 sc0 ls1 ws0">注意,语句可以不这样缩排,但建议这样做,因为可以增强脚本的清晰程度。在条件流</div><div class="t m0 xe h6 y5e ff2 fs1 fc0 sc0 ls3a ws0">下采取命令操作更方便。下面的例子测试<span class="_ _8"> </span><span class="ff3 ls0 wse">1 0</span><span class="ls0">是否小于<span class="_ _5"></span><span class="ff3 wse">1 2<span class="_"> </span></span></span>,此条件当然为真。因为条件为真,<span class="_ _2"> </span><span class="ff3 ls0 wse">i f</span></div><div class="t m0 xe h6 y5f ff2 fs1 fc0 sc0 ls3b ws0">语句内部继续执行,这里只有一个简单的<span class="_ _14"> </span><span class="ff3 ls0 wsf">e c h o<span class="_"> </span></span><span class="ls3c">命令。如果条件为假,脚本退出,因为此语句</span></div><div class="t m0 xe h6 y60 ff2 fs1 fc0 sc0 ls0 ws0">无<span class="ff3 ws1">e l s e<span class="_ _1"></span></span>部分。</div><div class="t m0 xe h5 y61 ff4 fs1 fc1 sc0 ls0 ws0">18.3.2 <span class="ff5">变量值测试</span></div><div class="t m0 xc h5 y62 ff2 fs1 fc0 sc0 ls1 ws0">通过测试设置为接受用户输入的变量可以测知用户是否输入信息。下面的例子中测试用</div><div class="t m0 x10 h9 y43 ff9 fs4 fc2 sc0 ls0 ws0">162<span class="_ _13"> </span><span class="ff7 fs1 fc0">第四部分<span class="_ _12"> </span>基础<span class="_ _10"></span><span class="ff8 ws1">s h e l l</span>编程</span></div><div class="c x1 y1 w2 h2"><div class="t m0 x2 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">下载</div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624e5c76fc37f87c24e197fe/bg4.jpg"><div class="t m0 x6 h6 y24 ff2 fs1 fc0 sc0 ls0 ws0">户键入<span class="_ _1"></span><span class="ff3 ws1">r e t u r n<span class="_ _1"></span></span>键后变量<span class="_ _c"></span><span class="ff3 ws1">n a m e</span><span class="ls31">是否包含任何信息。</span></div><div class="t m0 x6 h5 y63 ff4 fs1 fc1 sc0 ls0 ws0">18.3.3 grep<span class="ff5">输出检查</span></div><div class="t m0 x7 h6 y2a ff2 fs1 fc0 sc0 ls3d ws0">不必拘泥于变量或数值测试,也可以测知系统命令是否成功返回。对<span class="_ _15"> </span><span class="ff3 ls0 ws4">g r e p<span class="_"> </span></span><span class="ls0">使用<span class="_ _1"></span><span class="ff3 ws4">i f<span class="_ _1"></span></span>语句找出</span></div><div class="t m0 x6 h6 y64 ff3 fs1 fc0 sc0 ls0 ws10">g r e p<span class="_"> </span><span class="ff2 ls3e ws0">是否成功返回信息。下面的例子中<span class="_ _a"> </span></span>g r e p<span class="_"> </span><span class="ff2 ls33 ws0">用于查看<span class="_ _5"></span></span>D a v e<span class="_"> </span><span class="ff2 ls5 ws0">是否在数据文件<span class="_ _2"> </span></span>d a t a . f i l e<span class="_"> </span><span class="ff2 ls3f ws0">中,注意</span></div><div class="t m0 x11 h6 y65 ff2 fs1 fc0 sc0 ls0 ws0">‘<span class="ff3 ws1">D a v e \ ><span class="_"> </span></span><span class="ls33">’用于精确匹配。</span></div><div class="t m0 x7 h6 y66 ff2 fs1 fc0 sc0 ls3a ws0">上面的例子中,<span class="_ _5"></span><span class="ff3 ls0 ws11">g r e p<span class="_"> </span></span><span class="ls40">输出定向到系统垃圾堆。如果匹配成功,<span class="_ _8"> </span><span class="ff3 ls0 ws11">g r e p</span><span class="ls0">返回<span class="_ _1"></span><span class="ff3">0<span class="_ _10"></span></span>,将<span class="_ _5"></span><span class="ff3 ws11">g r e p</span>嵌入<span class="_ _5"></span><span class="ff3 ws11">i f</span>语</span></span></div><div class="t m0 x6 h6 y67 ff2 fs1 fc0 sc0 ls0 ws0">句;如果<span class="_ _5"></span><span class="ff3 ws1">g r e p<span class="_"> </span></span>成功返回,<span class="_ _c"></span><span class="ff3 ws1">i f<span class="_ _1"></span></span>部分为真。</div><div class="t m0 x6 h5 y68 ff4 fs1 fc1 sc0 ls0 ws0">18.3.4 <span class="ff5">用变量测试</span>grep<span class="ff5">输出</span></div><div class="t m0 x7 h6 y38 ff2 fs1 fc0 sc0 ls41 ws0">正像前面看到的,可以用<span class="_ _16"> </span><span class="ff3 ls0 ws12">g r e p<span class="_"> </span></span><span class="ls42">作字符串操作。下面的脚本中,用户输入一个名字列表,</span></div><div class="t m0 x6 h6 y39 ff3 fs1 fc0 sc0 ls0 ws1">g r e p<span class="ff2 ls43 ws0">在变量中查找,要求其包含人名<span class="_ _f"> </span></span>P e t e r<span class="_"> </span><span class="ff2 ws0">。</span></div><div class="t m0 x7 h5 y69 ff2 fs1 fc0 sc0 ls34 ws0">以下是对应输入名称的输出信息。</div><div class="t m0 xa h9 y43 ff7 fs1 fc0 sc0 ls0 ws0">第<span class="ff8">18</span>章<span class="_ _12"> </span>控制流结构<span class="_ _13"> </span><span class="ff9 fs4 fc2">163</span></div><div class="c x1 y1 w2 h2"><div class="t m0 xb h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">下载</div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>
<div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624e5c76fc37f87c24e197fe/bg5.jpg"><div class="t m0 xe h5 y6a ff4 fs1 fc1 sc0 ls0 ws0">18.3.5 <span class="ff5">文件拷贝输出检查</span></div><div class="t m0 xc h6 y6b ff2 fs1 fc0 sc0 ls44 ws0">下面测试文件拷贝是否正常,如果<span class="_ _8"> </span><span class="ff3 ls0 ws13">c p<span class="_ _1"></span></span><span class="ls45">命令并没有拷贝文件<span class="_ _2"> </span><span class="ff3 ls0 ws13">m y f i l e</span><span class="ls0">到<span class="_ _1"></span><span class="ff3 ws13">m y f i l e . b a k<span class="_"> </span></span><span class="lsc">,则打印错</span></span></span></div><div class="t m0 xe h6 y6c ff2 fs1 fc0 sc0 ls25 ws0">误信息。注意错误信息中`<span class="_ _3"></span><span class="ff3 ls1b">basename $0`<span class="_ _10"></span></span><span class="ls4">打印脚本名。</span></div><div class="t m0 xc h5 y6d ff2 fs1 fc0 sc0 ls1 ws0">如果脚本错误退出,一个好习惯是显示脚本名并将之定向到标准错误中。用户应该知道</div><div class="t m0 xe h5 y6e ff2 fs1 fc0 sc0 ls16 ws0">产生错误的脚本名。</div><div class="t m0 xc h5 y6f ff2 fs1 fc0 sc0 ls1 ws0">注意,文件可能没找到,系统也产生本身的错误信息,这类错误信息可能与输出混在一</div><div class="t m0 xe h5 y70 ff2 fs1 fc0 sc0 ls1e ws0">起。既然已经显示系统错误信息获知脚本失败,就没必要显示两次。要去除系统产生的错误</div><div class="t m0 xe h6 y71 ff2 fs1 fc0 sc0 ls46 ws0">和系统输出,只需简单的将标准错误和输出重定向即可。修改脚本为:<span class="_ _16"> </span><span class="ff3 ls34">>/dev/null 2>&1<span class="_ _10"></span></span><span class="ls0">。</span></div><div class="t m0 xc h5 y72 ff2 fs1 fc0 sc0 ls25 ws0">脚本运行时,所有输出包括错误重定向至系统垃圾堆。</div><div class="t m0 xe h5 y73 ff4 fs1 fc1 sc0 ls0 ws0">18.3.6 <span class="ff5">当前目录测试</span></div><div class="t m0 xc h5 y74 ff2 fs1 fc0 sc0 ls1 ws0">当运行一些管理脚本时,可能要在根目录下运行它,特别是移动某种全局文件或进行权</div><div class="t m0 xe h6 y75 ff2 fs1 fc0 sc0 ls3a ws0">限改变时。一个简单的测试可以获知是否运行在根目录下。下面脚本中变量<span class="_ _6"> </span><span class="ff3 ls0 ws14">D I R E C TO RY</span><span class="ls0">使用</span></div><div class="t m0 xe h6 y76 ff2 fs1 fc0 sc0 ls35 ws0">当前目录的命令替换操作,然后此变量值与<span class="_ _6"> </span><span class="ff3 ls0 ws15">" / "<span class="_ _1"></span></span><span class="lsa">字符串比较(<span class="_ _3"> </span><span class="ff3">/<span class="_ _10"></span></span><span class="ls47">为根目录)<span class="_ _4"></span><span class="ls48">。如果变量值与字符</span></span></span></div><div class="t m0 xe h6 y77 ff2 fs1 fc0 sc0 ls7 ws0">串不等,则用户退出脚本,退出状态为<span class="_ _f"> </span><span class="ff3">1<span class="_ _10"></span></span><span class="ls16">意味错误信息产生。</span></div><div class="t m0 x10 h9 y43 ff9 fs4 fc2 sc0 ls0 ws0">164<span class="_ _13"> </span><span class="ff7 fs1 fc0">第四部分<span class="_ _12"> </span>基础<span class="_ _1"></span><span class="ff8 ws1">s h e l l</span>编程</span></div><div class="c x1 y1 w2 h2"><div class="t m0 x2 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">下载</div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>