<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Rain Man</title><subtitle type="text">宠辱不惊，看庭前花开花落；去留无意，望天上云卷云舒。</subtitle><id>http://feed.cnblogs.com/blog/u/37071/rss</id><updated>2012-01-02T02:14:21Z</updated><author><name>Rain  Man</name><uri>http://www.cnblogs.com/rainman/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rainman/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/37071/rss"/><entry><id>http://www.cnblogs.com/rainman/archive/2011/12/29/2305677.html</id><title type="text">PHP中的include功能</title><summary type="text">1、include和require区别当要包含的文件不存在时，include产生一个警告（Warning），该语句后面的程序会继续执行；而 require则导致一个致命错误（Fatal error），程序就此终止。2、路径问题（适用于include和require)+c.php+folder1+----a.php+----folder2+--------b.phpa.php include &amp;#39;folder2/b.php&amp;#39;;b.php include &amp;#39;c.php&amp;#39;;执行a.php过程包含&amp;quot;b.php&amp;quot;，并执行&amp;quot;b.php&amp;quot;</summary><published>2011-12-29T02:14:00Z</published><updated>2011-12-29T02:14:00Z</updated><author><name>Rain  Man</name><uri>http://www.cnblogs.com/rainman/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rainman/archive/2011/12/29/2305677.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rainman/archive/2011/12/29/2305677.html"/><content type="html">&lt;div &gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、include和require区别&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;当要包含的文件不存在时，include产生一个警告（Warning），该语句后面的程序会继续执行；而 require则导致一个致命错误（Fatal error），程序就此终止。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;2、路径问题（适用于include和require)&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&lt;pre&gt;+c.php&#xD;
+folder1&#xD;
+----a.php&#xD;
+----folder2&#xD;
+--------b.php&#xD;
&#xD;
a.php&#xD;
    include 'folder2/b.php';&#xD;
b.php&#xD;
    include 'c.php';&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;执行a.php过程&lt;/p&gt;&#xD;
&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;包含"b.php"，并执行"b.php"&lt;/li&gt;&#xD;
&lt;li&gt;在folder1（当前工作目录，"a.php"所在目录下）下查找"c.php"，查找不到则执行下一步&lt;/li&gt;&#xD;
&lt;li&gt;在folder2（当前文件目录，"b.php"所在目录下）下查找"c.php"。&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&#xD;
&#xD;
&lt;p&gt;无论是"a.php"，还是"b.php"，若include路径中含有"../"，则都在当前工作目录（folder1）的上级目录中查找&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;3、变量作用域&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;一个文件被包含时，所包含的代码继承了“include”所在行的变量范围，该行处可用的任何变量在被包含的文件中都可用。主要针对于函数中的include。&lt;/li&gt;&#xD;
&lt;li&gt;所有在包含文件中定义的函数和类都具有全局作用域，和变量不同。普通变量的变量作用于继承了“include”所在行的变量范围，例如函数中的include。&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;4、include_path&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&lt;pre&gt;set_include_path(       &#xD;
    get_include_path()&#xD;
    . PATH_SEPARATOR . './library' &#xD;
    . PATH_SEPARATOR . './application/models'&#xD;
); &#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;默认的include_path=".;C:\xampp\php\PEAR"，使用set_include_path设置后，（不论文件的包含层级怎样）后续的所有程序都会使用该值，该函数可多次调用。&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/rainman/aggbug/2305677.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rainman/archive/2011/12/29/2305677.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rainman/archive/2011/11/28/2266193.html</id><title type="text">Comet：基于HTTP长连接的“服务器推”技术</title><summary type="text">1、基础知识	2、Comet的实现方法	3、LiveConnect的HTTP流	4、服务器端发送的Dom事件	5、连接管理1、基础知识HTTP流的概念持久HTTP流只是一种是HTTP链接保持打开状态的简单方法，这样大量的HTTP请求不需要进行打开和关闭操作就可以被一个一个地发送。常用PHP函数sleep(10); //暂停 10 秒 ob_flush();flush(); PHP向浏览器周期性发送数据的功能，并不是所有服务器都可行，更多相关信息请参阅www.php.net/flush。关于flush的内容，请参考深入理解ob_flush和flush的区别。&amp;lt;script&amp;gt;标签的执行</summary><published>2011-11-28T06:51:00Z</published><updated>2011-11-28T06:51:00Z</updated><author><name>Rain  Man</name><uri>http://www.cnblogs.com/rainman/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rainman/archive/2011/11/28/2266193.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rainman/archive/2011/11/28/2266193.html"/><content type="html">&lt;div &gt;&#xD;
&lt;ul&gt;&#xD;
	&lt;li&gt;&lt;a href="#1基础知识"&gt;1、基础知识&lt;/a&gt;&lt;/li&gt;&#xD;
	&lt;li&gt;&lt;a href="#2Comet的实现方法"&gt;2、Comet的实现方法&lt;/a&gt;&lt;/li&gt;&#xD;
	&lt;li&gt;&lt;a href="#3LiveConnect的HTTP流"&gt;3、LiveConnect的HTTP流&lt;/a&gt;&lt;/li&gt;&#xD;
	&lt;li&gt;&lt;a href="#4服务器端发送的Dom事件"&gt;4、服务器端发送的Dom事件&lt;/a&gt;&lt;/li&gt;&#xD;
	&lt;li&gt;&lt;a href="#5连接管理"&gt;5、连接管理&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;a name="1基础知识"&gt;&lt;/a&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、基础知识&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;HTTP流的概念&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;持久HTTP流只是一种是HTTP链接保持打开状态的简单方法，这样大量的HTTP请求不需要进行打开和关闭操作就可以被一个一个地发送。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;常用PHP函数&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&lt;pre&gt;sleep(10);  //暂停 10 秒 &#xD;
ob_flush();&#xD;
flush();    &#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;PHP向浏览器周期性发送数据的功能，并不是所有服务器都可行，更多相关信息请参阅&lt;a href="www.php.net/flush"&gt;www.php.net/flush&lt;/a&gt;。关于flush的内容，请参考&lt;a href="http://www.laruence.com/2010/04/15/1414.html"&gt;深入理解ob_flush和flush的区别&lt;/a&gt;。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&amp;lt;script&amp;gt;标签的执行时间&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在绝大多数浏览器中，当还没有读取到&amp;lt;/script&amp;gt;结束标签时，代码是不会执行的。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;配置脚本最大执行时间&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在Comet执行时，经常超过了php脚本的最大执行时间，因此需要配置max&lt;em&gt;execution&lt;/em&gt;time（详细参考：&lt;a href="http://apps.hi.baidu.com/share/detail/34514727"&gt;PHP - PHP.ini配置中文解释&lt;/a&gt;），并结合心跳机制。&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&lt;pre&gt;var iTimer;&#xD;
function heartbeat() {&#xD;
    clearTimeout(iTimer);&#xD;
    iTimer = setTimeout(function(){&#xD;
        // 执行一次Comet&#xD;
        // 300为服务器端配置的max_execution_time&#xD;
    }, 300);    &#xD;
}&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;a name="2Comet的实现方法"&gt;&lt;/a&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、Comet的实现方法&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;IE浏览器&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;demo.html&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&lt;pre&gt;&amp;lt;script type="text/javascript"&amp;gt;&#xD;
    var oPage = new ActiveXObject("htmlfile");&#xD;
    oPage.open();&#xD;
    oPage.write("&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;");&#xD;
    oPage.close();&#xD;
    oPage.body.innerHTML = '&amp;lt;iframe src="connection.php"&amp;gt;&amp;lt;/iframe&amp;gt;';        &#xD;
    oPage.parentWindow._parent = self;&#xD;
&#xD;
    function heartbeat() {}&#xD;
    function modifiedAt() {}&#xD;
&amp;lt;/script&amp;gt;&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;oPage.parentWindow访问的是HTMLFile对象的window属性&lt;/li&gt;&#xD;
&lt;li&gt;connection.php中JS使用top或parent访问的不是demo.html的window属性&lt;/li&gt;&#xD;
&lt;li&gt;connection.php中JS使用top或parent访问HTMLFile对象的window属性&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;p&gt;connection.php&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&lt;pre&gt;&amp;lt;html&amp;gt;&#xD;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&#xD;
&amp;lt;body&amp;gt;&#xD;
&amp;lt;script type="text/javascript"&amp;gt;&#xD;
    parent._parent.heartbeat();&#xD;
    parent._parent.modifiedAt();&#xD;
&amp;lt;/script&amp;gt;&#xD;
&amp;lt;/body&amp;gt;&#xD;
&amp;lt;/html&amp;gt;&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;其他浏览器&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;demo.html&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&lt;pre&gt;var oXHR = new XMLHttpRequest();&#xD;
oXHR.open('get', 'connection.php', true);&#xD;
oXHR.readystatechange = function() {&#xD;
    switch (oXHR.readyState) {&#xD;
        case 3:&#xD;
            alert(oXHR.responseText);&#xD;
            break;&#xD;
        case 4:&#xD;
            alert('done');&#xD;
    }&#xD;
};&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;每次从服务器收到数据时（即服务器端调用“ob_flush(); flush();”时），都会触发readyStatechange事件。&lt;/li&gt;&#xD;
&lt;li&gt;readyState等于3时，oXHR.responseText返回的内容，不是本次变化新增的内容，而是之前接受到的内容+本次变化新增的内容。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;a name="3LiveConnect的HTTP流"&gt;&lt;/a&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3、LiveConnect的HTTP流&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;LiveConnect是Firefox、Safari和Opera支持的一种未充分利用的技术，通过它可以再JavaScript种使用Java对象，但客户机必须安装JRE，并且浏览器必须启用Java。&lt;/p&gt;&#xD;
&#xD;
&lt;a name="4服务器端发送的Dom事件"&gt;&lt;/a&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4、服务器端发送的Dom事件&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;demo.html&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&lt;pre&gt;&amp;lt;body&amp;gt;&#xD;
    &amp;lt;event-source id="iBox" src="connection.php" /&amp;gt;&#xD;
    &amp;lt;script type="text/javascript"&amp;gt;&#xD;
        var iBox = document.getElementById('iBox');&#xD;
        iBox.addEventListener('modified', function(oEvent){&#xD;
            console.log(oEvent);&#xD;
        });&#xD;
    &amp;lt;/script&amp;gt;&#xD;
&amp;lt;/body&amp;gt;&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;connection.php&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&lt;pre&gt;&amp;lt;?php&#xD;
    header("Content-type:application/x-dom-event-stream");&#xD;
    while (true) {&#xD;
        echo 'Event: modified';&#xD;
        echo 'data: 5:23:06';       &#xD;
        ob_flush();&#xD;
        flush();&#xD;
        sleep(1);&#xD;
    }&#xD;
?&amp;gt;&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;event_source/&gt;使用的就是一个保持打开的链接&lt;/li&gt;&#xD;
&lt;li&gt;Event后面是事件名称，其余的是event对象的属性；每两个事件之间使用一个空白换行区分。&lt;/li&gt;&#xD;
&lt;li&gt;Target后面紧跟触发的元素，格式类似于CSS选择器。&#xD;
*　疑问之处，服务器端事件处理函数会不会触发浏览器的默认事件，即想&amp;lt;input type="submit"/&amp;gt;发送click事件，会不会提交表单，还是仅调用该元素的click绑定函数？&lt;/li&gt;&#xD;
&lt;li&gt;服务器端发送的Dom事件可以触发自定义事件，上例中的&amp;#8221;modified&amp;#8221;事件就是自定义事件。还可以触发客户端的UI事件，Dom Level 3事件规范中命名的所有事件都能够通过服务器端的Dom事件来触发。&lt;/li&gt;&#xD;
&lt;li&gt;不一定要为&lt;event_source/&gt;元素绑定事件处理函数，每个事件都将自动传给目标元素，并由钙元素的事件处理函数负责处理，如下例。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;p&gt;返回内容&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&lt;pre&gt;Event: click&#xD;
Target: #iBox&#xD;
button: 2&#xD;
screenX: 0&#xD;
screenY: 0&#xD;
Event: click&#xD;
Target: Document&#xD;
data: See you later!&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;支持性&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;到2006年10月为止，Opera9.0.1是唯一支持服务器端发送的Dom事件的浏览器，经测试Opera 11.52不支持。&lt;/p&gt;&#xD;
&#xD;
&lt;a name="5连接管理"&gt;&lt;/a&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5、连接管理&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;HTTP1.1协议中规定，一个客户端最多允许同时保持两个连接（这点取决于浏览器，迅雷等下载工具也会提高这个并发的数目）。使用Comet的后果就是会占用一个连接，具体的解决办法是为Comet指定专门的子域名。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Comet也会增加服务器的并发数目，所以在使用Comet技术之前要与维护服务器的人员交流，确保他们理解所要实现的功能，并给与支持。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Comet技术早在2007年左右就有人提出，最早的一篇文章是&lt;a href="alex.dojotoolkit.org/?p=538"&gt;What else is burried down in the depth’s of Google’s amazing JavaScript?&lt;/a&gt;，至今仍未大面积使用。主要原因还在于它对服务器的开销和开发模式上的改变，另一方面使用Ajax绝大多数情况下可以很好的替代Comet。&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/rainman/aggbug/2266193.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rainman/archive/2011/11/28/2266193.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rainman/archive/2011/11/18/2254340.html</id><title type="text">线性关系和相关系数</title><summary type="text">线性关系定义两个变量之间存在一次函数关系，就称它们之间存在线性关系。即如果可以用一个二元一次方程来表达两个变量之间关系的话，这两个变量之间的关系称为线性关系，因而，二元一次方程也称为线性方程。推而广之，含有n个变量的一次方程，也称为n元线性方程，不过这已经与直线没有什么关系了。扩展定义首先每一项（常数项除外）的次数必须是一次的（这是最重要的）。如果每项的次数不是一次就不是线性关系：x＝y * z（这里假定y、z是变量而不是常数），那么x与y，或x与z就不是线性关系。线性关系的显著特征是图像为过原点的直线；而当图像为不过原点的直线时，函数称为直线关系。线性关系与直线关系是两不同的，经常被大家搞混</summary><published>2011-11-18T08:35:00Z</published><updated>2011-11-18T08:35:00Z</updated><author><name>Rain  Man</name><uri>http://www.cnblogs.com/rainman/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rainman/archive/2011/11/18/2254340.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rainman/archive/2011/11/18/2254340.html"/><content type="html">&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;strong&gt;线性关系&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;两个变量之间存在一次函数关系，就称它们之间存在线性关系。&#xD;
即如果可以用一个二元一次方程来表达两个变量之间关系的话，这两个变量之间的关系称为线性关系，因而，二元一次方程也称为线性方程。&#xD;
推而广之，含有n个变量的一次方程，也称为n元线性方程，不过这已经与直线没有什么关系了。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;扩展定义&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;首先每一项（常数项除外）的次数必须是一次的（这是最重要的）。&lt;br/&gt;如果每项的次数不是一次就不是线性关系：x＝y * z（这里假定y、z是变量而不是常数），那么x与y，或x与z就不是线性关系。&lt;/li&gt;&#xD;
&lt;li&gt;线性关系的显著特征是图像为过原点的直线；而当图像为不过原点的直线时，函数称为直线关系。&lt;br/&gt;线性关系与直线关系是两不同的，经常被大家搞混淆。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;p&gt;百科：&lt;a href="http://baike.baidu.com/view/91595.htm"&gt;线性关系&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;相关系数&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;相关系数是用以反映变量之间相关关系密切程度的统计指标，但无法确切地表明两个变量之间相关的程度。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;相关关系是一种非确定性的关系，相关系数是研究变量之间线性相关程度的量。由于研究对象的不同，相关系数有如下几种定义方式。&lt;/p&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;如将反映两变量间&lt;strong&gt;线性相关关系&lt;/strong&gt;的统计指标称为相关系数；&lt;/li&gt;&#xD;
&lt;li&gt;将反映两变量间&lt;strong&gt;曲线相关关系&lt;/strong&gt;的统计指标称为非线性相关系数、非线性判定系数；&lt;/li&gt;&#xD;
&lt;li&gt;将反映&lt;strong&gt;多元线性相关关系&lt;/strong&gt;的统计指标称为复相关系数、复判定系数等。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;p&gt;百科：&lt;a href="http://wiki.mbalib.com/wiki/%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0"&gt;相关系数&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/rainman/aggbug/2254340.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rainman/archive/2011/11/18/2254340.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rainman/archive/2011/09/16/2179313.html</id><title type="text">Shell脚本语法</title><summary type="text">索引1. 第一行必须是&amp;quot;#!/bin/sh&amp;quot;2. 注释：#号后的为注释3. 定义变量4. 逻辑符号5. 接收参数6. 控制流：if/then/elif/else/fi7. 循环：for/do/done8. 格式化输出日期9. exist10. 系统变量参考文档1. 第一行必须是&amp;quot;#!/bin/sh&amp;quot;它不是注释，&amp;quot;#!/bin/sh&amp;quot;是对shell的声明，说明你所用的是那种类型的shell及其路径所在；如果没有声明，则脚本将在默认的shell中执行，默认shell是由用户所在的系统定义为执行shell脚本的shell.如果脚本被编写为在</summary><published>2011-09-16T15:42:00Z</published><updated>2011-09-16T15:42:00Z</updated><author><name>Rain  Man</name><uri>http://www.cnblogs.com/rainman/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rainman/archive/2011/09/16/2179313.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rainman/archive/2011/09/16/2179313.html"/><content type="html">&lt;div &gt;&#xD;
&lt;p&gt;&lt;strong&gt;索引&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#1第一行必须是BinSh"&gt;1. 第一行必须是"#!/bin/sh"&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#2注释一行开头为"&gt;2. 注释：#号后的为注释&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#3定义变量"&gt;3. 定义变量&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#4逻辑符号"&gt;4. 逻辑符号&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#5接收参数"&gt;5. 接收参数&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#6控制流IfThenElifElseFi"&gt;6. 控制流：if/then/elif/else/fi&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#7循环ForDoDone"&gt;7. 循环：for/do/done&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#8格式化输出日期"&gt;8. 格式化输出日期&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#9Exist"&gt;9. exist&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#10系统变量"&gt;10. 系统变量&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#参考文档"&gt;参考文档&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1. 第一行必须是"#!/bin/sh"&lt;a name="1第一行必须是BinSh"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;它不是注释，"#!/bin/sh"是对shell的声明，说明你所用的是那种类型的shell及其路径所在；&lt;/li&gt;&#xD;
&lt;li&gt;如果没有声明，则脚本将在默认的shell中执行，默认shell是由用户所在的系统定义为执行shell脚本的shell.&lt;/li&gt;&#xD;
&lt;li&gt;如果脚本被编写为在Kornshell ksh中运行，而默认运行shell脚本的为C shell csh,则脚本在执行过程中很可能失败。&lt;/li&gt;&#xD;
&lt;li&gt;所以建议大家就把"#!/bin/sh"当成C 语言的main函数一样，写shell必须有，以使shell程序更严密。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2. 注释：一行开头为 #&lt;a name="2注释一行开头为"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3. 定义变量&lt;a name="3定义变量"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;定义单变量&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;p_name='kang'&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;使用单变量&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;echo  $p_name'.js'    # 输出kang.js&#xD;
echo  $p_name.js      # 输出kang.js&#xD;
cp  $p_name.js  copy.js;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4. 逻辑符号&lt;a name="4逻辑符号"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;命令1 &amp;amp;&amp;amp; 命令2&lt;a name="命令1命令2"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果左边的&amp;ldquo;命令1&amp;rdquo;执行成功，那么右边的&amp;ldquo;命令2&amp;rdquo;才会被执行。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;命令1 || 命令2&lt;a name="命令1命令21"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;与&amp;amp;&amp;amp;相反。如果&amp;ldquo;命令1&amp;rdquo;未执行成功，那么就执行&amp;ldquo;命令2&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;()  {}&lt;a name=""&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;...&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5. 接收参数&lt;a name="5接收参数"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;脚本文件&amp;ldquo;copy.sh&amp;rdquo;，其内容如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;m=$1&#xD;
n=$2&#xD;
echo $m-$n&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;执行命令：&amp;ldquo;sh  copy.sh  111  222&amp;rdquo;；输出 111-222&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;6. 控制流：if/then/elif/else/fi&lt;a name="6控制流IfThenElifElseFi"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意"["和"]"前后的空格必须有，否则提示错误&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;m="kang2"&#xD;
if [ "$m" == 'kang' ]; then&#xD;
    echo 'kang'&#xD;
elif [ $m == 'kang2' ]; then&#xD;
    echo 'kang2'&#xD;
else&#xD;
    echo 'no'&#xD;
fi&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;示例：判断文件夹&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;if [ -d './js' ]; then&#xD;
 echo 'js是文件夹'&#xD;
fi&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;7. 循环：for/do/done&lt;a name="7循环ForDoDone"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意：循环项是以&amp;ldquo;空格&amp;rdquo;拆分的字符串&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;name="rain man's blog"&#xD;
for loop in $name; do&#xD;
    echo $loop;&#xD;
done&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;8. 格式化输出日期&lt;a name="8格式化输出日期"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;curdate="`date +%Y%m%d%H%M%S`"&#xD;
echo $curdate&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;执行结果：20110904175817&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;9. exist&lt;a name="9Exist"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;退出当前shell脚本，一般来说，返回0表示执行成功，其他值表示没有执行成功。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;exist 0    # 返回0&#xD;
exist 1    # 返回1&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;10. 系统变量&lt;a name="10系统变量"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;pwd=$PWD      # 当前目录&#xD;
user=$USER    # 当前用户&#xD;
echo $pwd&#xD;
echo $user&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;运行脚本后输出：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;/home/rainman/test&#xD;
rainman&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考文档&lt;a name="参考文档"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://learn.akae.cn/media/ch31s05.html"&gt;http://learn.akae.cn/media/ch31s05.html&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/rainman/aggbug/2179313.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rainman/archive/2011/09/16/2179313.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rainman/archive/2011/09/16/2179304.html</id><title type="text">Linux基础命令（2）</title><summary type="text">索引Fskey servernamescp命令grep 命令find 命令echo 命令xargs 命令file 命令cat 命令/dev/nulltar 打包gzip 压缩示例：打包和压缩awk 命令综合示例Fskey servername保存登陆信息，下次登陆不必再输入密码Fskey username@192.168.0.2scp命令说明用于2个 linux 主机间复制文件格式：scp [可选参数] file_source file_target示例从“本次”复制到“远程”：复制文件：scp local_file_path username@192.168.0.2:remote...</summary><published>2011-09-16T15:30:00Z</published><updated>2011-09-16T15:30:00Z</updated><author><name>Rain  Man</name><uri>http://www.cnblogs.com/rainman/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rainman/archive/2011/09/16/2179304.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rainman/archive/2011/09/16/2179304.html"/><content type="html">&lt;div &gt;&#xD;
&lt;p&gt;&lt;strong&gt;索引&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#FskeyServername"&gt;Fskey servername&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#Scp命令"&gt;scp命令&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#Grep命令"&gt;grep 命令&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#Find命令"&gt;find 命令&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#Echo命令"&gt;echo 命令&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#Xargs命令"&gt;xargs 命令&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#File命令"&gt;file 命令&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#Cat命令"&gt;cat 命令&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#DevNull"&gt;/dev/null&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#Tar打包"&gt;tar 打包&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#Gzip压缩"&gt;gzip 压缩&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#示例打包和压缩"&gt;示例：打包和压缩&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#Awk命令"&gt;awk 命令&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="#综合示例"&gt;综合示例&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Fskey servername&lt;a name="FskeyServername"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;保存登陆信息，下次登陆不必再输入密码&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;Fskey  username@192.168.0.2&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;scp命令&lt;a name="Scp命令"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;说明&lt;a name="说明"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;用于2个 linux 主机间复制文件&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;格式：&lt;a name="格式"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;scp  [可选参数]  file_source  file_target&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例&lt;a name="示例"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;从&amp;ldquo;本次&amp;rdquo;复制到&amp;ldquo;远程&amp;rdquo;：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;复制文件：scp  local_file_path  username@192.168.0.2:remote_folder_path&#xD;
复制目录：scp  -r  local_file_path  username@192.168.0.2:remote_folder_path&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;从 &amp;ldquo;远程&amp;rdquo; 复制到 &amp;ldquo;本地&amp;rdquo;：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;复制文件：scp  username@192.168.0.2:remote_folder_path  local_file_path&#xD;
复制目录：scp  -r  username@192.168.0.2:remote_folder_path  local_file_path&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;grep 命令&lt;a name="Grep命令"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;grep命令是一种强大的文本搜索工具，它能使用正则表达式搜索文本，并把匹配的行打印出来&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例&lt;a name="示例1"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在文件4.txt中查找含student的行&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;grep  student  4.tx&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在所有以d开头的文件中查找含test的行&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;grep 'test'  d*&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在aa.js、bb.js、cc.js文件中查找含test的行&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;grep 'test' aa.js bb.js cc.js&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;从当前文件夹的所有子文件（包含子目录中的文件）中查找含test的行&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;grep 'test' . -r&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例：-E（开启正则查找）&lt;a name="示例E开启正则查找"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;查找含&amp;ldquo;template/&amp;rdquo;或&amp;ldquo;static/&amp;rdquo;的行&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;grep -E "template/|static/"  test.text&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;查找含&amp;ldquo;template/|static/&amp;rdquo;的行&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;grep "template/|static/"  test.text&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;查找含&amp;ldquo;$&amp;rdquo;的行&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;grep "\\$" test.text&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;find 命令&lt;a name="Find命令"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在指定目录下查找文件，查找的范围包含了&amp;ldquo;指定目录&amp;rdquo;的子目录。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;格式&lt;a name="格式1"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;find pathname -options&#xD;
    * -print： find命令将匹配的文件输出到标准输出&#xD;
    * -type：&#xD;
        * b - 块设备文件。&#xD;
        * d - 目录。&#xD;
        * c - 字符设备文件。&#xD;
        * p - 管道文件。&#xD;
        * l - 符号链接文件。&#xD;
        * f - 普通文件。&#xD;
    * -name：按照文件名查找文件。&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例&lt;a name="示例2"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;列出当前用户目录（/home/username/）下的所有文件，下面两句命令作用相同&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;find $HOME -print&#xD;
find ~ -print&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在当前目录下的所有.svn文件夹&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;find  .  -type  d  -name  '.svn'&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在当前目录下查找文件名包含ent的文件&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;find . -type f -name '*ent*'&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;echo 命令&lt;a name="Echo命令"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;向屏幕上打印输出；或将内容输出到某一文件中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例：&lt;a name="示例3"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;打印222&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;echo '222';&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;将222&amp;ldquo;输出&amp;rdquo;到log.txt，会替换到原文件里的内容。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;echo '222' &amp;gt;log.txt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;将222&amp;ldquo;追加&amp;rdquo;到log.txt&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;echo '222' &amp;gt;&amp;gt;log.txt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;清空log.txt&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;echo  &amp;gt;log.txt&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;逐行读取t.js的文件，追加到Log.txt中&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;while read line; &#xD;
do &#xD;
    echo $line &amp;gt;&amp;gt;log.txt;&#xD;
done &amp;lt;'t.js'&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;xargs 命令&lt;a name="Xargs命令"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;大多数 Linux 命令都会产生输出：文件列表、字符串列表等。 &lt;br /&gt; 但如果要使用其他某个命令并将前一个命令的输出作为参数该怎么办？使用xargs。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例：&lt;a name="示例4"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在当前目录下查找&amp;ldquo;.svn&amp;rdquo;文件夹，并产出这些文件夹。&amp;ldquo;find&amp;rdquo;命令查找，然后将查找出的内容传给后面的&amp;ldquo;rm&amp;rdquo;命令&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;find . -type d -name ".svn" | xargs rm -rf;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;file 命令&lt;a name="File命令"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;辨识文件类型，有些类似windows中的"查看-&amp;gt;详细信息列表"&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例&lt;a name="示例5"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;列出当前目录下所有&amp;ldquo;文件&amp;rdquo;和&amp;ldquo;文件夹&amp;rdquo;的信息&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;file ./*;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;列出当前目录下&amp;ldquo;docs&amp;rdquo;文件夹的信息&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;file ./docs;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;cat 命令&lt;a name="Cat命令"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;输出，类似于echo；但其可以对输出的内容进行加工&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参数：&lt;a name="参数"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;n 或 --number 由 1 开始对所有输出的行数编号&#xD;
-b 或 --number-nonblank 和 -n 相似，只不过对于空白行不编号&#xD;
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行，就代换为一行的空白行&#xD;
v 或 --show-nonprinting&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例：&lt;a name="示例6"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;textfile的内容为：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;aaa&#xD;
&#xD;
bbb&#xD;
ccc&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;把 textfile1 的档案内容加上行号后输入到 textfile2 这个档案里&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;cat -n textfile1 &amp;gt; textfile2;&#xD;
&#xD;
textfile2的内容为：&#xD;
     1  aaa&#xD;
     2&#xD;
     3  bbb&#xD;
     4  ccc&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;把 textfile1 的档案内容加上行号（空白行不加）之后将内容附加到 textfile2 里。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;cat -n textfile1 &amp;gt; textfile2;&#xD;
&#xD;
textfile2的内容为：&#xD;
     1  aaa&#xD;
&#xD;
     2  bbb&#xD;
     3  ccc&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;把 textfile1 和 textfile2 的档案内容加上行号（空白行不加）之后将内容附加到 textfile3 里。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;cat -b textfile1 textfile2 &amp;gt;&amp;gt; textfile3&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;此为&lt;strong&gt;清空&lt;/strong&gt;/etc/test.txt档案内容，使用echo不能完全清空文件内容，文件仍有一个空行符。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;cat /dev/null &amp;gt; /etc/test.txt&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;cat 也可以用来制作 image file。例如要制作软碟的 image file，将软碟放好后打&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;cat /dev/fd0 &amp;gt; OUTFILE&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;相反的，如果想把 image file 写到软碟，请打&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;cat IMG_FILE &amp;gt; /dev/fd0&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;/dev/null&lt;a name="DevNull"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例&lt;a name="示例7"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;禁止标准输出，原本要输出的内容，现被写入到"/dev/null"中，从而不显示任何内容&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;cat filename &amp;gt;/dev/null;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;带有编号的示例&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;2 # 如果"$filename"不存在，将不会有任何错误信息提示&lt;/li&gt;&#xD;
&lt;li&gt;3 ...&lt;/li&gt;&#xD;
&lt;li&gt;还有其他的编号&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;禁止标准输出和标准错误的输出&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;cat filename 2&amp;gt;/dev/null &amp;gt;/dev/null&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;tar 打包&lt;a name="Tar打包"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;所谓打包，就是把多个文件(夹)组成一个集合。linux下只能对一个文件进行压缩，所以如果想对多个文件进行压缩的话，就必须先打包。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;格式： tar -参数 压缩后的文件名 需要压缩的文件&lt;a name="格式Tar参数压缩后的文件名需要压缩的文件"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参数&lt;a name="参数1"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;-c ：建立一个压缩文件的参数指令(create 的意思)；&lt;/li&gt;&#xD;
&lt;li&gt;-x ：解开一个压缩文件的参数指令！&lt;/li&gt;&#xD;
&lt;li&gt;-t ：查看 tarfile 里面的文件！&lt;/li&gt;&#xD;
&lt;li&gt;特别注意，c/x/t 仅能存在一个！因为不可能同时压缩与解压缩。&lt;/li&gt;&#xD;
&lt;li&gt;-z ：是否需要用 gzip 压缩？&lt;/li&gt;&#xD;
&lt;li&gt;-j ：是否需要用 bzip2 压缩？&lt;/li&gt;&#xD;
&lt;li&gt;-v ：压缩的过程中显示文件！&lt;/li&gt;&#xD;
&lt;li&gt;-f ：使用档名，请留意，f后面紧跟归档的文件名&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;gzip 压缩&lt;a name="Gzip压缩"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对打包后的文件进行压缩&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例：打包和压缩&lt;a name="示例打包和压缩"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;压缩&lt;a name="压缩"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;将整个 "/etc" 目录下的文件全部打包成为 "/tmp/etc.tar"&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;tar  -cvf  /tmp/etc.tar  /etc;      # 仅打包，不压缩&#xD;
tar  -zcvf  /tmp/etc.tar.gz  /etc;  # 打包，并以 gzip 压缩&#xD;
tar  -jcvf  /tmp/etc.tar.bz2  /etc; # 打包，并以 bzip2 压缩&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;解压和解包&lt;a name="解压和解包"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;gzip -d test.tar.gz;    # 将&amp;ldquo;test.tar.gz&amp;rdquo;解压为&amp;ldquo;test.tar&amp;rdquo;  &#xD;
tar  -xf  test.tar;     # 将&amp;ldquo;test.tar&amp;rdquo;的包解开&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;上述两步骤可以合称为：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;tar -zxvf .tar.gz;    # 解开一个gizp压缩的包&#xD;
tar -xvf  .tar;       # 解开一个tar包&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;awk 命令&lt;a name="Awk命令"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;awk是一种用于处理数据和生成报告的编程语言。一般的使用格式是：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;awk '{pattern + action}' {filenames}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;文件test.txt的内容如下，相应的分割符号为两个空格&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;aa2  bb3  cc4&#xD;
dd  ee  ff&#xD;
gg  ee  hh&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;执行命令：awk '{print $2}' test.txt，该命令的&amp;ldquo;pattern&amp;rdquo;部分为空，就是匹配所有行，输出结果如下&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;bb3&#xD;
ee&#xD;
ee&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;执行命令：awk '/e/ {print $2}' test.txt，该命令会匹配含有字符"e"的行，输出结果如下&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;ee&#xD;
ee&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;综合示例&lt;a name="综合示例"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;svn st | grep -E 'template/|static/' | grep -E 'M|?' | awk '{print $2}'&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;上述命令的功能是，筛选出当前版本库内&amp;ldquo;template&amp;rdquo;和&amp;ldquo;static&amp;rdquo;两个目录下修改的文件，并打印出这些文件，详解：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;* 第一部分：显示文件和子目录的状态&#xD;
* 第二部分：筛选出含template/或static/的行&#xD;
* 第三部分：筛选出含M或?的行&#xD;
* 第三部分：只输出文件的地址列&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/rainman/aggbug/2179304.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rainman/archive/2011/09/16/2179304.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rainman/archive/2011/09/11/2173597.html</id><title type="text">PNG图片详解</title><summary type="text">1、PNG图片类型PNG格式有8位、24位、32位三种，下面是一些术语：索引透明：类似于GIF，某一像素只有全透和全不透明两种效果Alpha透明：半透明PNG88位的PNG最多支持256（2的8次方）种颜色，8位的PNG支持索引透明和alpha透明。PNG24支持2的24次方种颜色，但不支持透明信息。PNG3232位的PNG在24位的PNG基础上增加了8位的透明信息，因此支持不同程度的半透效果。总结格式颜色种类位数透明支持PNG82的8次方8不支持PNG8+索引透明2的8次方8仅支持全透或全不透明PNG8+alpha透明2的8次方8支持半透明PNG242的24次方24不支持PNG322的32次</summary><published>2011-09-11T04:01:00Z</published><updated>2011-09-11T04:01:00Z</updated><author><name>Rain  Man</name><uri>http://www.cnblogs.com/rainman/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rainman/archive/2011/09/11/2173597.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rainman/archive/2011/09/11/2173597.html"/><content type="html">&lt;div &gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、PNG图片类型&lt;a name="Png图片类型"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;PNG格式有8位、24位、32位三种，下面是一些术语：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;strong&gt;索引透明&lt;/strong&gt;：类似于GIF，某一像素只有全透和全不透明两种效果&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;Alpha透明&lt;/strong&gt;：半透明&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;PNG8&lt;a name="Png8"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;8位的PNG最多支持256（2的8次方）种颜色，8位的PNG支持索引透明和alpha透明。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;PNG24&lt;a name="Png24"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;支持2的24次方种颜色，但不支持透明信息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;PNG32&lt;a name="Png32"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;32位的PNG在24位的PNG基础上增加了8位的透明信息，因此支持不同程度的半透效果。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;总结&lt;a name="总结"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;table &gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;th&gt;格式&lt;/th&gt;&lt;th&gt;颜色种类&lt;/th&gt;&lt;th&gt;位数&lt;/th&gt;&lt;th&gt;透明支持&lt;/th&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;PNG8&lt;/td&gt;&#xD;
&lt;td&gt;2的8次方&lt;/td&gt;&#xD;
&lt;td&gt;8&lt;/td&gt;&#xD;
&lt;td&gt;不支持&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;PNG8+索引透明&lt;/td&gt;&#xD;
&lt;td&gt;2的8次方&lt;/td&gt;&#xD;
&lt;td&gt;8&lt;/td&gt;&#xD;
&lt;td&gt;仅支持全透或全不透明&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;PNG8+alpha透明&lt;/td&gt;&#xD;
&lt;td&gt;2的8次方&lt;/td&gt;&#xD;
&lt;td&gt;8&lt;/td&gt;&#xD;
&lt;td&gt;支持半透明&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;PNG24&lt;/td&gt;&#xD;
&lt;td&gt;2的24次方&lt;/td&gt;&#xD;
&lt;td&gt;24&lt;/td&gt;&#xD;
&lt;td&gt;不支持&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;PNG32&lt;/td&gt;&#xD;
&lt;td&gt;2的32次方&lt;/td&gt;&#xD;
&lt;td&gt;32&lt;/td&gt;&#xD;
&lt;td&gt;支持半透明&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、图形处理软件&lt;a name="生成工具"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Fireworks&lt;a name="Fireworks"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在Fireworks中，以上提到的各种格式PNG都能正确生成，只要在OPTIMIZE面板中选择相应的格式即可。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/rainman/139529/o_a.png" title="Fireworks导出PNG" alt="Fireworks导出PNG" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Photoshop&lt;a name="Photoshop"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在Photoshop（简称PS）中，PNG格式选择可以通过选择File菜单的Save for Web &amp;amp; Devices实现，注意：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;PS不支持8位PNG+alpha透明的格式；&lt;/li&gt;&#xD;
&lt;li&gt;PS中也没有32位PNG选项，但其中的PNG24+透明实际上就是PNG32。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/rainman/139529/o_b.png" title="Photoshop导出PNG" alt="Photoshop导出PNG" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3、浏览器支持情况&lt;a name="浏览器支持情况"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;IE6对PNG8和PNG32的半透明效果并不支持，用滤镜可解决PNG32的半透明问题，但解决不了PNG8的半透明效果。&lt;/p&gt;&#xD;
&lt;p&gt;下面我们测试一下浏览器对透明PNG的支持情况，其中IE6使用滤镜对PNG图片进行加载。其余浏览器则使用img标签。经过试验，发现非IE6浏览器表现一致，而IE6对PNG8+alpha透明支持的不够好，图像半透明部分是完全按照全透明方式进行处理的。 测试结果如下图所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/rainman/139529/o_%E6%9C%AA%E5%91%BD%E5%90%8D.PNG" title="IE6下PNG图片的兼容性测试" alt="IE6下PNG图片的兼容性测试" width="671" height="850" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4、总结&lt;a name="总结1"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;PNG格式有8位、24位、32位三种形式。&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;8位PNG支持两种不同的透明形式（索引透明和alpha透明）；&lt;/li&gt;&#xD;
&lt;li&gt;24位PNG不支持透明；&lt;/li&gt;&#xD;
&lt;li&gt;32位PNG 在24位基础上增加了8位透明通道，因此可展现256级透明程度。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;图片处理工具&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;strong&gt;Photoshop&lt;/strong&gt;：不支持也不能输出PNG8+alpha透明的PNG；&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;Photoshop&lt;/strong&gt;：32位PNG输出是由24位PNG加透明信息形式输出；&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;Fireworks&lt;/strong&gt;：对 PNG支持较好。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;浏览器支持性&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;非IE6的浏览器都能正常显示包含透明信息（包括索引透明和alpha透明）的PNG图片;&lt;/li&gt;&#xD;
&lt;li&gt;IE6在滤镜的帮助下能够PNG32的透明PNG图像&lt;/li&gt;&#xD;
&lt;li&gt;IE6下无论是否是用滤镜，半透明部分是完全按照全透明方式进行处理；&lt;/li&gt;&#xD;
&lt;li&gt;IE6对 PNG8+alpha透明的图像支持不够好。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考文章&lt;a name="参考文章"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本文绝大部分是转载，转自：《&lt;a href="http://hi.baidu.com/jz1108/blog/item/e3760ad14a358d349b5027dd.html" target="_blank" title="说说PNG的那点事儿"&gt;说说PNG的那点事儿&lt;/a&gt;》&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://hi.baidu.com/jz1108/blog/item/e3760ad14a358d349b5027dd.html" target="_blank" title="说说PNG的那点事儿"&gt;说说PNG的那点事儿&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.ued163.com/645/" target="_blank" title="请给PNG8一个机会（二）"&gt;请给PNG8一个机会（二）&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.ued163.com/640/" target="_blank" title="请给PNG8一个机会（一）"&gt;请给PNG8一个机会（一）&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/rainman/aggbug/2173597.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rainman/archive/2011/09/11/2173597.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rainman/archive/2011/09/05/2168162.html</id><title type="text">表单元素的submit()方法和onsubmit事件</title><summary type="text">表单元素拥有submit方法，同时也具有onsubmit事件句柄，用于监听表单提交。可以使用elemForm.submit();方法触发表单提交。表单元素中出现了name=&amp;quot;submit&amp;quot;的元素这种情况下elemForm.submit();将不会触发表单提交，因为表单原始的submit方法将会被覆盖（formElem.submit就是对该元素的引用）。elemForm.submit();不会触发表单的onsubmit事件没有为什么，标准中就是这么规定的。与此有些类似的是onfocus、onblur和focus()、blur()之间的关系却不同，调用elem.blur()或e</summary><published>2011-09-05T15:38:00Z</published><updated>2011-09-05T15:38:00Z</updated><author><name>Rain  Man</name><uri>http://www.cnblogs.com/rainman/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rainman/archive/2011/09/05/2168162.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rainman/archive/2011/09/05/2168162.html"/><content type="html">&lt;div &gt;&#xD;
&lt;p&gt;表单元素拥有submit方法，同时也具有onsubmit事件句柄，用于监听表单提交。可以使用elemForm.submit();方法触发表单提交。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;表单元素中出现了name="submit"的元素&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这种情况下elemForm.submit();将不会触发表单提交，因为表单原始的submit方法将会被覆盖（formElem.submit就是对该元素的引用）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;elemForm.submit();不会触发表单的onsubmit事件&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;没有为什么，标准中就是这么规定的。&lt;/p&gt;&#xD;
&lt;p&gt;与此有些类似的是onfocus、onblur和focus()、blur()之间的关系却不同，调用elem.blur()或elem.focus()却会触发onblur和onfocus事件。&lt;/p&gt;&#xD;
&lt;p&gt;这些为我们提供了一个思路，在设计一些UI组件时，需要考虑一些事件在内部调用时是否要触发相关事件。&#xD;
例如Dialog组件，它具有onopen事件，同时返回的对象也会有open()方法，我们这时就必须考虑下open()方法是否需要触发onopen()事件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;动态创建表单时遇到的问题&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;经常使用的一种方法如下，他会在表单submit前调用，根据validate()函数的返回值决定是否需要提交表单。&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;code&gt;&amp;lt;form onsubmit="return validate();"&amp;gt;&amp;lt;/form&amp;gt;&#xD;
&lt;/code&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;然而，如果要动态地为一个表单添加验证，即HTML代码中没有写onsubmit，而在页面加载后用javascript给这个form加一个handler，问题就 来了。假设我们已经得到了表单的DOM节点，保存在变量elemForm中，一般这样来给它加上handler：&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;code&gt;var check = function() {&#xD;
    if ('OK') {&#xD;
        return true;&#xD;
    } else {&#xD;
        return false;&#xD;
    }&#xD;
};&#xD;
if (elemForm.addEventListener) {&#xD;
    elemForm.addEventListener("submit", check, false);&#xD;
} else if (elemForm.attachEvent) {&#xD;
    elemForm.attachEvent("onsubmit", check);&#xD;
}&#xD;
&lt;/code&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;问题就出现了：在Firefox和Chrome中"return false;"是不能阻止表单的提交的(在IE中可以)，这就是为什么大家在onsubmit属性中要写"return check()"，而不仅仅是"check()"。&lt;/p&gt;&#xD;
&lt;p&gt;原因是什么呢？请看&lt;a href="http://www.w3.org/TR/DOM-Level-2-Events/ecma-script-binding.html" target="_blank"&gt;ECMAScript Language Binding&lt;/a&gt;，其中明确地写着，"Object EventListener: This is an ECMAScript function reference. This method has no return value. The parameter is a Event object"，意思就是event listener没有返回值。&#xD;
换一种理解，addEventListener可以为元素绑定多个监听函数，某一个事件监听函数的返回值，不可以作为整个事件的返回值。可以使用下面的方法解决&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;code&gt;function check(ev) {&#xD;
    ev = ev || window.event; // Event对象&#xD;
    if (ev.preventDefault) { // 标准浏览器&#xD;
        e.preventDefault();&#xD;
    } else { // IE浏览器&#xD;
        window.event.returnValue = false;&#xD;
    }&#xD;
}&#xD;
&lt;/code&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;其实一切的根本都因为IE不支持DOM Level 2。&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/rainman/aggbug/2168162.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rainman/archive/2011/09/05/2168162.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rainman/archive/2011/08/17/2143631.html</id><title type="text">CSS背景图片居中的细节</title><summary type="text">经常会使用background-position:left center，将背景图片垂直居中。浏览器渲染页面的最小单位是像素，所以某些情况下即使定义了“center”，实际效果也未必是垂直居中。例如：元素：高16px；背景图片：高13px；定义background-position:left center实际效果如下图：可以清晰的看到背景图片距上边框“2px”，距下边框“1px”。上图是在Chrome下测试结果，其它浏览器也是如此，只不过是有的距上边框“1px”，距下边框“2px”。解决方案若想实现100%垂直居中，则“元素高度 - 背景图片高度”可以被2整除，所以上例可以将元素高度设置为“1</summary><published>2011-08-17T13:51:00Z</published><updated>2011-08-17T13:51:00Z</updated><author><name>Rain  Man</name><uri>http://www.cnblogs.com/rainman/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rainman/archive/2011/08/17/2143631.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rainman/archive/2011/08/17/2143631.html"/><content type="html">&lt;div &gt;&#xD;
&lt;p&gt;经常会使用background-position:left center，将背景图片垂直居中。浏览器渲染页面的最小单位是像素，所以某些情况下即使定义了&amp;ldquo;center&amp;rdquo;，实际效果也未必是垂直居中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;例如：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;元素：高16px；&lt;/li&gt;&#xD;
&lt;li&gt;背景图片：高13px；&lt;/li&gt;&#xD;
&lt;li&gt;定义background-position:left center&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;实际效果如下图：&lt;br /&gt;&#xD;
&lt;img src="http://images.cnblogs.com/cnblogs_com/rainman/139529/o_13px.png" alt="背景图片垂直居中" /&gt;&lt;br /&gt;&#xD;
可以清晰的看到背景图片距上边框&amp;ldquo;2px&amp;rdquo;，距下边框&amp;ldquo;1px&amp;rdquo;。上图是在Chrome下测试结果，其它浏览器也是如此，只不过是有的距上边框&amp;ldquo;1px&amp;rdquo;，距下边框&amp;ldquo;2px&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;若想实现100%垂直居中，则&amp;ldquo;元素高度 - 背景图片高度&amp;rdquo;可以被2整除，所以上例可以将元素高度设置为&amp;ldquo;17px&amp;rdquo;，或将背景图片高度更改为&amp;ldquo;12px&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/rainman/aggbug/2143631.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rainman/archive/2011/08/17/2143631.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rainman/archive/2011/08/17/2142767.html</id><title type="text">CSS优先级</title><summary type="text">CSS优先级包含四个级别标签内定义样式ID选择符Class选择符元素选择符CSS优先级的计算规则类型计算规则元素标签中定义的样式（Style属性）加1,0,0,0每个ID选择符(如 #id)加0,1,0,0每个Class选择符(如 .class)、每个属性选择符(如 [attribute=])、每个伪类(如 :hover)加0,0,1,0每个元素选择符（如p）或伪元素选择符(如 :firstchild)等加0,0,0,1其它选择符包括全局选择符*，不过这也是一种specificity。加0,0,0,0，相当于没加然后，将这四个数字分别累加，就得到每个CSS定义的优先级的值从左到右逐位比较大小，</summary><published>2011-08-17T02:30:00Z</published><updated>2011-08-17T02:30:00Z</updated><author><name>Rain  Man</name><uri>http://www.cnblogs.com/rainman/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rainman/archive/2011/08/17/2142767.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rainman/archive/2011/08/17/2142767.html"/><content type="html">&lt;div &gt;&#xD;
&lt;p&gt;&lt;strong&gt;CSS优先级包含四个级别&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;标签内定义样式&lt;/li&gt;&#xD;
&lt;li&gt;ID选择符&lt;/li&gt;&#xD;
&lt;li&gt;Class选择符&lt;/li&gt;&#xD;
&lt;li&gt;元素选择符&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;CSS优先级的计算规则&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;table &gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;计算规则&lt;/th&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;元素标签中定义的样式（Style属性）&lt;/td&gt;&#xD;
&lt;td&gt;加1,0,0,0&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;每个ID选择符(如 #id)&lt;/td&gt;&#xD;
&lt;td&gt;加0,1,0,0&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;每个Class选择符(如 .class)、每个属性选择符(如 [attribute=])、每个伪类(如 :hover)&lt;/td&gt;&#xD;
&lt;td&gt;加0,0,1,0&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;每个元素选择符（如p）或伪元素选择符(如 :firstchild)等&lt;/td&gt;&#xD;
&lt;td&gt;加0,0,0,1&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;其它选择符包括全局选择符*，&lt;br /&gt;不过这也是一种specificity。&lt;/td&gt;&#xD;
&lt;td&gt;加0,0,0,0，相当于没加&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;然后，将这四个数字分别累加，就得到每个CSS定义的优先级的值&lt;/li&gt;&#xD;
&lt;li&gt;从左到右逐位比较大小，数字大的CSS样式的优先级就高。&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;!important声明的样式优先级最高，如果冲突再进行计算。&lt;/li&gt;&#xD;
&lt;li&gt;如果优先级相同，则选择最后出现的样式。&lt;/li&gt;&#xD;
&lt;li&gt;继承得到的样式的优先级最低。&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;table &gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;th&gt;选择器&lt;/th&gt;&lt;th&gt;计算结果&lt;/th&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;* { }&lt;/td&gt;&#xD;
&lt;td&gt;0&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;li { }&lt;/td&gt;&#xD;
&lt;td&gt;1 &amp;nbsp;(one element)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;li:first-line { }&lt;/td&gt;&#xD;
&lt;td&gt;2 &amp;nbsp;(one element, one pseudo-element)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;ul li { }&lt;/td&gt;&#xD;
&lt;td&gt;2 &amp;nbsp;(two elements)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;ul ol+li { }&lt;/td&gt;&#xD;
&lt;td&gt;3 &amp;nbsp;(three elements)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;h1 + *[rel=up] { }&lt;/td&gt;&#xD;
&lt;td&gt;1,1 &amp;nbsp;(one attribute, one element)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;ul ol li.red { }&lt;/td&gt;&#xD;
&lt;td&gt;1,3 &amp;nbsp;(one class, three elements)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;li.red.level { }&lt;/td&gt;&#xD;
&lt;td&gt;2,1 &amp;nbsp;(two classes, one element)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;style=&amp;rdquo;&amp;rdquo;&lt;/td&gt;&#xD;
&lt;td&gt;1,0,0,0 &amp;nbsp;(one inline styling)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;p { }&lt;/td&gt;&#xD;
&lt;td&gt;1 &amp;nbsp;(one HTML selector)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;div p { }&lt;/td&gt;&#xD;
&lt;td&gt;2 &amp;nbsp;(two HTML selectors)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;.sith&lt;/td&gt;&#xD;
&lt;td&gt;1,0 &amp;nbsp;(one class selector)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;div p.sith { }&lt;/td&gt;&#xD;
&lt;td&gt;1,2 &amp;nbsp;(two HTML selectors and a class selector)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;#sith&lt;/td&gt;&#xD;
&lt;td&gt;1,0,0 &amp;nbsp;(one id selector)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;body #darkside .sith p { }&lt;/td&gt;&#xD;
&lt;td&gt;1,1,2 &amp;nbsp;(HTML selector, id selector, class selector, HTML selector; 1+100+10+1)&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;IE6 链接优先级Bug&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;正常计算结果：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;a:hover = div .yellowLink = a.yellowLink&#xD;
a:visited = div .yellowLink = a.yellowLink&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;IE6计算结果：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;a:hover &amp;gt; div .yellowLink&#xD;
a:hover &amp;gt; a.yellowLink&#xD;
a:visited &amp;gt; div .yellowLink&#xD;
a:visited &amp;gt; a.yellowLink&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;在IE6里面，a:hover的优先级比div.greenLink a高。并且，同样的结论在:visited和:active里面也有。&lt;/li&gt;&#xD;
&lt;li&gt;在IE6里面，&amp;ldquo;.orange_link .orange_link a&amp;rdquo;的优先级和&amp;ldquo;a:hover&amp;rdquo;一样高&lt;/li&gt;&#xD;
&lt;li&gt;IE6里，&amp;ldquo;.orange_link .orange_link .orange_link a&amp;rdquo;(三个class)的优先级比&amp;ldquo;a:hover&amp;rdquo;要高&lt;/li&gt;&#xD;
&lt;li&gt;IE6中，&amp;ldquo;a#blue_link&amp;rdquo;或是&amp;ldquo;#blue_link&amp;rdquo;的优先级比a:hover要高&lt;/li&gt;&#xD;
&lt;li&gt;以上的结论在:visited和:active也成立，但是:link没有这样的bug。另外IE7和IE8beta1没有这个bug。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;解决办法：不给a定义伪类颜色（这种解决方案在&amp;ldquo;用户可用性&amp;rdquo;上并不好）；或使用#id重置过来。&lt;br /&gt;&#xD;
以上结论记不住也就算了，知道IE6中存在这个Bug就可以了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考文章&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.cnblogs.com/ddshou/archive/2009/05/05/1449770.html" target="_blank"&gt;IE里关于CSS的优先级的bug（二）&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.cnblogs.com/ddshou/archive/2009/05/05/1449768.html" target="_blank"&gt;IE里关于CSS的优先级的bug（三）&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考链接&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://yslove.net/2009/07/css-specificity/" target="_blank"&gt;CSS权重（优先级）&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.csdn.net/goplay122/article/details/6084441" target="_blank"&gt;CSS优先级权重计算法&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.w3.org/TR/CSS21/cascade.html#specificity" target="_blank"&gt;Calculating a selector's specificity&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/rainman/aggbug/2142767.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rainman/archive/2011/08/17/2142767.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rainman/archive/2011/08/14/2137934.html</id><title type="text">JsDoc Toolkit</title><summary type="text">简介JsDoc Toolkit 是一款辅助工具，你只需要根据约定在 JavaScript 代码中添加相应的注释，它就可以根据这些注释来自动生成API文档。对Java 熟悉的人可能会发现它和 Java 的文档自动化工具 JavaDoc 很像，没错，JsDoc Toolkit 就是基于 JavaDoc 开发的。下载地址http://code.google.com/p/jsdoc-toolkit/目录结构app : 存放的是js文件。包括一些实例文件和读取js和模板生成文档的js文件。conf : 提供默认的配置的文件。java : 存放的是“rhino”这是一个脚本java写的javascript</summary><published>2011-08-14T06:27:00Z</published><updated>2011-08-14T06:27:00Z</updated><author><name>Rain  Man</name><uri>http://www.cnblogs.com/rainman/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rainman/archive/2011/08/14/2137934.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rainman/archive/2011/08/14/2137934.html"/><content type="html">&lt;div &gt;&#xD;
&lt;p&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;JsDoc Toolkit 是一款辅助工具，你只需要根据约定在 JavaScript 代码中添加相应的注释，它就可以根据这些注释来自动生成API文档。对Java 熟悉的人可能会发现它和 Java 的文档自动化工具 JavaDoc 很像，没错，JsDoc Toolkit 就是基于 JavaDoc 开发的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://code.google.com/p/jsdoc-toolkit/" target="_blank"&gt;http://code.google.com/p/jsdoc-toolkit/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;目录结构&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;app    :   存放的是js文件。包括一些实例文件和读取js和模板生成文档的js文件。&lt;/li&gt;&#xD;
&lt;li&gt;conf   :    提供默认的配置的文件。&lt;/li&gt;&#xD;
&lt;li&gt;java   :    存放的是&amp;ldquo;rhino&amp;rdquo;这是一个脚本java写的javascript脚本引擎，用来提供js的运行环境。&lt;/li&gt;&#xD;
&lt;li&gt;templates :   存放生成文档的模板，根据不同的模板可以生成html xml等各种类型文档。&lt;/li&gt;&#xD;
&lt;li&gt;jsrun.jar，jsdebug.jar   :   生成的入口调用了rhino框架和js文件&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;工作模式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过一段java代码（jsrun.jar）调用rhino框架（该框架提供了一个运行javascript的环境），然后再运行javascript读取生成文档的javascript文件和模板文件生成文档。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;注释标签&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里的标签是指约定的注释标签，只有写了这些标签， JsDoc Toolkit 才能根据这些标签来生成正确的文档，比如在 @example 之后跟一段小的代码例子。&lt;/p&gt;&#xD;
&lt;p&gt;可用标签列表：&lt;a href="http://code.google.com/p/jsdoc-toolkit/wiki/TagReference" target="_blank"&gt;http://code.google.com/p/jsdoc-toolkit/wiki/TagReference&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;使用&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;首先切换到当前目录下，windows执行下面命令&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;&amp;gt; java -jar jsrun.jar app\run.js -a -t=templates\jsdoc mycode.js&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;Mac OS或Linux执行西面命令&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;$ java -jar jsrun.jar app/run.js -a -t=templates/jsdoc mycode.js&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;如果成功的话，你就会看到当前文件夹里多出了一个叫做 out 的文件夹，生成的文档就在里面了！然后你就可以在浏览器中查看了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&amp;ldquo;java -jar jsrun.jar app/run.js&amp;rdquo; ：固定代码，每次运行时都必须含有的。&lt;/li&gt;&#xD;
&lt;li&gt;-a 或者 &amp;ndash;allfunctions ：为全部函数生成文档，包括那些没有写注释的。&lt;/li&gt;&#xD;
&lt;li&gt;-c 或者 &amp;ndash;conf ：使用配置文件&lt;/li&gt;&#xD;
&lt;li&gt;-d= 或者 &amp;ndash;directory=：指定生成文档的输出目录，默认是 &amp;ldquo;out&amp;rdquo;&lt;/li&gt;&#xD;
&lt;li&gt;-e= 或者 &amp;ndash;encoding=：指定编码方式&lt;/li&gt;&#xD;
&lt;li&gt;-n 或者 &amp;ndash;nocode ：忽略所有代码，只为有 @name 标签的注释生成文档。&lt;/li&gt;&#xD;
&lt;li&gt;-o= 或者 &amp;ndash;out= ： 将日志信息输出到指定文件&lt;/li&gt;&#xD;
&lt;li&gt;-q 或者 &amp;ndash;quiet ： 不输出任何信息，包括警告。&lt;/li&gt;&#xD;
&lt;li&gt;-t= 或者 &amp;ndash;template= ：指定文档的模板，这个参数必须提供&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;查看帮助&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre&gt;$ java -jar jsrun.jar app/run.js --help&#xD;
	&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Rhino&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Mozilla's Rhino JavaScript runtime engine.官网：&lt;a href="http://www.mozilla.org/rhino/" target="_blank"&gt;http://www.mozilla.org/rhino/&lt;/a&gt;,该单词的意思是犀牛。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考文章&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://wangchennwpu-126-com.iteye.com/blog/953087" target="_blank"&gt;JSDOC学习记录&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.zhuoqun.net/html/y2009/1363.html" target="_blank"&gt;JsDoc Toolkit 简介&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.tugai.net/2010/01/08/jsdoc-toolkit-usage/" target="_blank"&gt;JSDOC TOOLKIT:JAVASCRIPT文档利器&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/rainman/aggbug/2137934.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rainman/archive/2011/08/14/2137934.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
