<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[静怡家园]]></title> 
<link>http://www.zhanghaijun.com/index.php</link> 
<description><![CDATA[书山有路勤为径，学海无涯苦作舟！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[静怡家园]]></copyright>
<item>
<link>http://www.zhanghaijun.com/post//</link>
<title><![CDATA[如何控制命令执行顺序]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[Linux技术]]></category>
<pubDate>Sat, 30 Mar 2013 06:37:51 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//</guid> 
<description>
<![CDATA[ 
	在执行某个命令的时候，有时需要依赖于前一个命令是否执行成功。例如，假设你希望将一个目录中的文件全部拷贝到另外一个目录中后，然后删除源目录中的全部文件。在删除之前，你希望能够确信拷贝成功，否则就有可能丢失所有的文件。 <br/>在本章中，我们将讨论：<br/><br/>命令执行控制。<br/>命令组合。 <br/><br/>如果希望在成功地执行一个命令之后再执行另一个命令，或者在一个命令失败后再执行另一个命令，&&和&#124;&#124;可以完成这样的功能。相应的命令可以是系统命令或shell脚本。 <br/>Shell还提供了在当前shell或子shell中执行一组命令的方法，即使用（）和&#123;&#125;。<br/><br/>6.1 使用&&<br/><br/>使用&&的一般形式为： <br/>命令1 && 命令2<br/>这种命令执行方式相当地直接。&&左边的命令（命令1）返回真(即返回0，成功被执行）后，&&右边的命令（命令2）才能够被执行；换句话说，“如果这个命令执行成功&&那么执行这个命令”。 <br/>这里有一个使用&&的简单例子： <br/>$ cp justing.doc justing.bak && echo “if you are seeing this then cp was OK”<br/>if you are seeing this then cp was OK<br/>在上面的例子中，&&前面的拷贝命令执行成功，所以&&后面的命令（echo命令）被执行。 <br/>再看一个更为实用的例子： <br/>$ mv /apps/bin /apps/dev/bin && rm -r /apps/bin<br/>在上面的例子中，/apps/bin目录将会被移到/apps/dev/bin目录下，如果它没有被成功执行，就不会删除/apps/bin目录。 <br/>在下面的例子中，文件quarter_end.txt首先将被排序并输出到文件quarter.sorted中，只有这一命令执行成功之后，文件quarter.sorted才会被打印出来： <br/>$ sort quarter_end.txt > quarter.sorted && lp quarter.sorted<br/><br/>6.2 使用&#124;&#124;<br/><br/>使用&#124;&#124;的一般形式为： <br/>命令1 &#124;&#124; 命令2<br/>&#124;&#124;的作用有一些不同。如果&#124;&#124;左边的命令（命令1）未执行成功，那么就执行&#124;&#124;右边的命令（命令2）；或者换句话说，“如果这个命令执行失败了&#124;&#124; 那么就执行这个命令”。 <br/>这里有一个使用&#124;&#124;的简单例子： <br/>$ cp wopper.txt wopper.bak &#124;&#124; echo “if you are seeing this cp failed”<br/><br/>cp: wopper.txt: No such file or directory<br/>if you are seeing this cp failed<br/>在上面的例子中，拷贝命令没有能够被成功执行，因此&#124;&#124;后面的命令被执行。 <br/>这里有一个更为实用的例子。我希望从一个审计文件中抽取第1个和第5个域，并将其输出到一个临时文件中，如果这一操作未成功，我希望能够收到一个相应邮件： <br/>$ awk ‘&#123;print $5&#125;’ acc.qtr > qtr.tmp &#124;&#124; echo “Sorry the payroll extraction didn’t work” &#124; mail dave<br/>在这里不只可以使用系统命令；这里我们首先对month_end.txt文件执行了一个名为comet的shell脚本，如果该脚本未执行成功，该shell将结束。 <br/>$ comet month_end.txt &#124;&#124; exit<br/><br/>6.3 用（）和&#123;&#125;将命令结合在一起 <br/><br/>如果希望把几个命令合在一起执行， shell提供了两种方法。既可以在当前shell也可以在子shell中执行一组命令。 <br/>为了在当前shell中执行一组命令，可以用命令分隔符隔开每一个命令，并把所有的命令用圆括号（）括起来。 <br/>它的一般形式为： <br/>（命令1;命令2;. . .） <br/>如果使用&#123; &#125;来代替（），那么相应的命令将在子shell而不是当前shell中作为一个整体被执行，只有在&#123; &#125;中所有命令的输出作为一个整体被重定向时，其中的命令才被放到子shell中执行，否则在当前shell执行。它的一般形式为： <br/>&#123;命令1;命令2;. . . &#125;<br/>我很少单独使用这两种方法。我一般只和&&或&#124;&#124;一起使用这两种方法。 <br/>再回到前面那个comet脚本的例子，如果这个脚本执行失败了，我很可能会希望执行两个以上的命令，而不只是一个命令。我可以使用这两种方法。这是原先那个例子： <br/>$ comet month_end.txt &#124;&#124; exit<br/>现在如果该脚本执行失败了，我希望先给自己发个邮件，然后再退出，可以用下面的方法来实现： <br/>$ comet month_end &#124;&#124; (echo “Hello, guess what! Comet did not work”&#124;mail dave;exit)<br/>在上面的例子中，如果只使用了命令分隔符而没有把它们组合在一起，shell将直接执行最后一个命令（exit）。 <br/>我们再回头来看看前面那个使用&&排序的例子，下面是原来的那个例子： <br/>$ sort quarter_end.txt > quarter.sorted && lp quarter.sorted<br/>使用命令组合的方法，如果sort命令执行成功了，可以先将输出文件拷贝到一个日志区，然后再打印。 <br/><br/>6.4 小结<br/><br/>在编写shell脚本时，使用&&和&#124;&#124;对构造判断语句非常有用。如果希望在前一个命令执行失败的情况不执行后面的命令，那么本章所讲述的方法非常简单有效。使用这样的方法，可以根据&&或&#124;&#124;前面命令的返回值来控制其后面命令的执行。<br/>Tags - <a href="http://www.zhanghaijun.com/tags/%25E5%2591%25BD%25E4%25BB%25A4%25E6%2589%25A7%25E8%25A1%258C%25E9%25A1%25BA%25E5%25BA%258F/" rel="tag">命令执行顺序</a>
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post//#blogcomment</link>
<title><![CDATA[[评论] 如何控制命令执行顺序]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>