<?xml version="1.0"?>
<rss version="2.0">
<channel>
  <title>午夜咖啡 - 脚本语言 category</title>
  <link>http://jolestar.com/categories/script/</link>
  <description>jolestar&#039;s blog, 放羊娃王老五的博客</description>
  <language>zh</language>
  <copyright>jolestar</copyright>
  <lastBuildDate>Mon, 30 Nov 2009 05:17:00 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  
  
  <item>
    <title>微软对google说:不要把手伸到我媳妇怀里</title>
    <link>http://jolestar.com/2009/09/27/1254022980000.html</link>
    
      
      
        <description>
          &lt;p&gt;Google Chrome Frame 是一个开源的IE插件，目标是让Internet Explorer用户也可以享受IE不支持的新web技术以及Chrome快速的JavaScript引擎带来的好处。 它可以让IE支持HTML5的标签（如:canvas）,还可以提升IE的JavaScript性能,使您的应用程序反应更快。&lt;/p&gt;
&lt;p&gt;官方网站:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;http://code.google.com/chrome/chromeframe/&#034; target=&#034;_blank&#034;&gt;http://code.google.com/chrome/chromeframe/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&#034;http://jolestar.com/2009/09/27/1254022980000.html&#034;&gt;阅读全文...&lt;/a&gt;&lt;/p&gt;
        </description>
      
    
    
    
    <category>html/css</category>
    
    <category>脚本语言</category>
    
    <comments>http://jolestar.com/2009/09/27/1254022980000.html#comments</comments>
    <guid isPermaLink="true">http://jolestar.com/2009/09/27/1254022980000.html</guid>
    <pubDate>Sun, 27 Sep 2009 03:43:00 GMT</pubDate>
  </item>
  
  <item>
    <title>Javascript(Ajax)开发测试工具</title>
    <link>http://jolestar.com/2009/05/20/1242803580000.html</link>
    
      
      
        <description>
          &lt;p&gt;本文介绍了一些javascript的开发测试工具。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href=&#034;http://jolestar.com/2009/05/20/1242803580000.html&#034;&gt;阅读全文...&lt;/a&gt;&lt;/p&gt;
        </description>
      
    
    
    
    <category>脚本语言</category>
    
    <comments>http://jolestar.com/2009/05/20/1242803580000.html#comments</comments>
    <guid isPermaLink="true">http://jolestar.com/2009/05/20/1242803580000.html</guid>
    <pubDate>Wed, 20 May 2009 07:13:00 GMT</pubDate>
  </item>
  
  <item>
    <title>javascript库的延迟加载</title>
    <link>http://jolestar.com/2009/05/14/1242283440000.html</link>
    
      
      
        <description>
          &lt;p&gt;为了提高网页响应速度，经常会有延迟加载js的需求。&lt;/p&gt;
&lt;p&gt;但如何延迟加载javascript并控制其加载顺序？本文提供了一种实现方式。&lt;/p&gt;
&lt;p&gt;以延迟加载SyntaxHighlighter库为例。&lt;/p&gt;&lt;p&gt;&lt;a href=&#034;http://jolestar.com/2009/05/14/1242283440000.html&#034;&gt;阅读全文...&lt;/a&gt;&lt;/p&gt;
        </description>
      
    
    
    
    <category>脚本语言</category>
    
    <comments>http://jolestar.com/2009/05/14/1242283440000.html#comments</comments>
    <guid isPermaLink="true">http://jolestar.com/2009/05/14/1242283440000.html</guid>
    <pubDate>Thu, 14 May 2009 06:44:00 GMT</pubDate>
  </item>
  
  <item>
    <title>Javascript对象中使用setTimeout和setInterval的问题</title>
    <link>http://jolestar.com/2009/04/03/1238757420000.html</link>
    
      
        <description>
          &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 前两天写一个js时遇到个问题。就是在js对象内部如果用&lt;span&gt;setTimeout或者setInterval调用该对象的一个方法，然后在被调用方法中就无法使用this获取该对象。因为经过&lt;span&gt;setTimeout调用后，this就成了浏览器了，原来那个对象就丢失了。&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如：&lt;/p&gt;
&lt;p&gt;
&lt;pre name=&#034;code&#034; class=&#034;js&#034;&gt; function TestObj(){   
    this.property = &#034;test&#034;;   
    this.called = function(){   
       alert(this.property);   
     }   
    this.setTimeCall = function(){   
         setTimeout(this.called,500);   
     }   
 }   

var test = new TestObj();   
test.setTimeCall();  &lt;/pre&gt;
&amp;nbsp;&lt;/p&gt;
&lt;p&gt;如果直接调用test.called方法是没有问题的。但如果通过setTimeout调用，也就是调用
test.setTimeCall(),this.property就为空了。因为这里的this成浏览器了。同样的问题也发生在监听浏览器的其他事件
上。没办法，于是用了个比较糟糕的办法。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;pre name=&#034;code&#034; class=&#034;js&#034;&gt;function TestObj(){   
   this.property = &#034;test&#034;;   
   this.called = function(){   
       alert(this.property);   
}   
   this.setTimeCall = function(){   
    setTimeout(&#034;test.called()&#034;,500);   
}   
}   
var test = new TestObj();   
test.setTimeCall();  &lt;/pre&gt;
&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;之所以说这样做糟糕，是因为在定义TestObj时，就必须提前知道TestObj被创建时的变量名。后来在IBM社区看到一篇探讨javascript有限状态机的文章，用了一个很巧妙的办法避免这个问题。&lt;/p&gt;
&lt;p&gt;
&lt;pre name=&#034;code&#034; class=&#034;js&#034;&gt; function TestObj(){   
    this.property = &#034;test&#034;;   
    var self = this;   
     this.called = function(){   
         alert(self.property);   
     }   

     this.setTimeCall = function(){   
         setTimeout(self.called,500);   
     }   
 }   

 var test = new TestObj();   
 test.called();   
 test.setTimeCall();  &lt;/pre&gt;
&amp;nbsp;&lt;/p&gt;
&lt;p&gt;在TestObj中定义一个变量，self，然后指向this。这样用self调用this，就不会发生和浏览器的this对象冲突的问题了。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;虽然是很简单的一个问题，但有时候人脑子转不过弯也没办法。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;还有一个网友评论提供的办法就是:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;pre name=&#034;code&#034; class=&#034;js&#034;&gt;function TestObj(){  

    this.called = function(){  
        alert(&#034;OK&#034;);  
    }  
      
    this.setTimeCall = function(){  
        setTimeout(this.called.bind(this),500);  
    }  
}   &lt;/pre&gt;
&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Related Posts&lt;/b&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/09/27/1254022980000.html&#034;&gt;微软对google说:不要把手伸到我媳妇怀里&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/05/09/1241883360000.html&#034;&gt;终于在网上建了个家&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/05/14/1242283440000.html&#034;&gt;javascript库的延迟加载&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/05/20/1242803580000.html&#034;&gt;Javascript(Ajax)开发测试工具&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/04/08/1239131820000.html&#034;&gt;css强制换行问题&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2007/08/21/1187697600000.html&#034;&gt;javascript获取网页元素的最终样式&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;
        </description>
      
      
    
    
    
    <category>脚本语言</category>
    
    <comments>http://jolestar.com/2009/04/03/1238757420000.html#comments</comments>
    <guid isPermaLink="true">http://jolestar.com/2009/04/03/1238757420000.html</guid>
    <pubDate>Fri, 03 Apr 2009 11:17:00 GMT</pubDate>
  </item>
  
  <item>
    <title>Shell(Bash)学习笔记(一)</title>
    <link>http://jolestar.com/2008/04/06/1207420620000.html</link>
    
      
        <description>
          &lt;p&gt;以前只是简单看过一些文章，了解一些。平时也就是写个简单的命令组合啥的，没写过复杂的脚本。最近一次为了恢复数据，写了一下脚本，发现这东西光学不练确实不行。顺便记一下学习笔记备用。&lt;/p&gt;
&lt;p&gt;约定：本文中的shell特指bash.&lt;/p&gt;
&lt;p&gt;由于javaeye博客编辑器没有提供shell代码格式，就只好勉强用javascript脚本格式插入代码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一.变量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;变量直接赋值，不用提前声明。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;var=&#034;Hello&#034;
var=Hello
var=&#039;Hello&#039;
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;注意几点：&lt;/p&gt;
&lt;p&gt;1.变量和值之间不能有空格，否则解释器会认为是几个命令。很多程序员的习惯是在＝号两边留空格为了好看，但这点在shell中行不通。&lt;/p&gt;
&lt;p&gt;2.字符串不必用&#034;号或者&#039;，上面的几种赋值方式是等价的。除非字符串之间有空格的时候。&lt;/p&gt;
&lt;p&gt;如:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;var=&#034;Hello World&#034;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;这时候就需要用引号。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3.&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;var=&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;这样的语句也是合法的，表示var的值为空。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4.使用变量的时候需要在变量前面加上$符号。这一点php程序员比较熟悉。 &lt;/p&gt;
&lt;p&gt;如:&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;echo $var&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;这也就是为什么shell中的字符串不必用引号的原因。你如果直接运行&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;echo var&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;系统会将var当作字符串，而不是变量处理。在变量前加上$号还有个好处就是在字符串中输出变量的时候，直接在字符串里面用变量就行。&lt;/p&gt;
&lt;p&gt;如：&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;var=World
var2=&#034;$var World&#034;
echo $var2&lt;/pre&gt;
&amp;nbsp;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;但与php不同的是变量赋值的时候不用加$符号。因为shell中没有==这个符号，判断相等也是用＝号。如果赋值的时候加上$号，会产生混淆。&lt;/p&gt;
&lt;p&gt;还有一点要注意的就是单引号（&#039;）字符串 中的变量不会被替换。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;var=World
var2=&#039;$var World&#039;
echo $var2&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;上面的语句输出结果：$var World&lt;/p&gt;
&lt;p&gt;这个可以用来输出$等特殊符号，而不用担心字符被当作变量替换。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二.语句&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.shell的语句不必用;号结束，除非是同一行写几个语句的时候。&lt;/p&gt;
&lt;p&gt;2.shell中的语句块不用{}号扩起来。if语句一般就用fi表示结束。当然这个也有特例，后面会提到。&lt;/p&gt;
&lt;p&gt;3.if语句
&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;if [ condition ]
then 
    action
elif [ condition2 ]
then 
    action2
.
.
.
elif [ condition3 ]
then 
else
    actionx
fi&lt;/pre&gt;
&amp;nbsp;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;需要注意的是shell中没有elseif，而是elif(这个缩写也太变态了吧，有必要么？).&lt;/p&gt;
&lt;p&gt;每个或者elif后跟着then，并且要换行或者用;分开。then可以和后面的action在一行。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3.for循环
&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;var=&#034;one two three four&#034;
for x in $var
do
     echo $x
done&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;for循环用do&amp;nbsp; 和 done表示开始结束，不要举一反三，认为是用 rof结束。&lt;/p&gt;
&lt;p&gt;4.while和util循环&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;while [ condition ]
 do
     statements
 done&lt;/pre&gt;
&amp;nbsp;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;until [ condition ]
 do
     statements
 done&lt;/pre&gt;
&amp;nbsp;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5.条件语句&lt;/p&gt;
&lt;p&gt; shell中的条件语句用[]号括起来，用于if,while,until等结构。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;条件判断用=号，而不是==号。条件语句与[] 号之间要有空格分开。&lt;/p&gt;
&lt;p&gt;如:
&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;gender=&#034;boy&#034;
if [ &#034;$gender&#034; = &#034;girl&#034; ]
then
      echo &#039;Welcome!&#039;
else
      echo &#039;We only welcome girl.&#039;
fi&lt;/pre&gt;
&amp;nbsp;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;还有要注意的是条件语句中=号两旁要有空格分开，否则shell会将条件语句整个作为一个字符串处理，条件永远为真。条件语句中的变量最好用&#034;号引
起来，否则如果该变量中有空格，shell就会报too many arguments错误。如果变量正好为空，则会报 =: unary
operator expected.错误。因为变量为空的话，条件语句少了一边，当然会出错。所以，&lt;strong&gt;将字符串&lt;/strong&gt;&lt;strong&gt;变量用双引号括起来是shell编程的好习惯,尤其在条件语句中。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;其他的比较符号,如 &amp;gt;,&amp;lt;，不能直接在条件语句中使用，因为&amp;gt;号在shell中有特殊含义。下面是shell的比较运算符号表示方法:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:text&#034;&gt;算术比较运算符

num1-eq num2 	等于	[ 3 -eq $mynum ]
num1-ne num2 	不等于	[ 3 -ne $mynum ]
num1-lt num2 	小于	[ 3 -lt $mynum ]
num1-le num2 	小于或等于	[ 3 -le $mynum ]
num1-gt num2 	大于	[ 3 -gt $mynum ]
num1-ge num2 	大于或等于	[ 3 -ge $mynum ]&lt;/pre&gt;
&amp;nbsp;
&lt;pre name=&#034;code&#034; class=&#034;brush:text&#034;&gt;字符串比较运算符 

-z string 	如果 string长度为零，则为真 	[ -z &#034;$myvar&#034; ]
-n string 	如果 string长度非零，则为真 	[ -n &#034;$myvar&#034; ]
string1= string2 	如果 string1与 string2相同，则为真 	[ &#034;$myvar&#034; = &#034;one two three&#034; ]
string1!= string2 	如果 string1与 string2不同，则为真 	[ &#034;$myvar&#034; != &#034;one two three&#034; ]&lt;/pre&gt;
&lt;p&gt;6.case 语句&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;gender=&#034;boy&#034; 
case &#034;$gender&#034; in
      boy)
            echo &#034;We only welcome girl.&#034;
            ;;
      girl)
            echo &#039;Welcome !&#039;
            ;;
      *)
            echo &#034;unknow.&#034;
            ;;
 esac  &lt;/pre&gt;
&amp;nbsp;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;case语句的语法比较怪，乍一看比较别扭。每个pattern用 半括号括起来,用;;结束。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三.算术&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;shell 默认是用来处理字符串的，所以如果你直接运行:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;echo 1+1&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;它会直接输出1+1，而不会输出2。 如果需要计算表达式的值，则只需用&#034;$((&#034; 和 &#034;))&#034;将表达式
括起。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;echo $((1+1))&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;四.函数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;add(){
    result=0
    for n in $*
    do
        result=$(($result+$n))
    done
    return $result
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;执行:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;add 1 2 3
echo $?
echo $result&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;两个输出结果都是:6.&lt;/p&gt;
&lt;p&gt;这里需要几点说明.shell中是不能直接获得函数的返回值的，如果你要用函数返回值，只能用全局变量传输。
shell中的变量默认都是全局的，除非你在前面加了local修饰符。如上面的例子，在函数外面，result变量也是可见的。如果你在result前
加local修饰，result变量在函数外就不可见了。但shell会把函数返回值放在$?全局变量中，你可以用$?
来取得前个函数调用的返回值。$*可以获得函数的所有输入参数，$1表示第一个参数，以此类推。 &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;五.其他&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;shell内置的一些特征，可以很容易的处理文件,以及和其他程序交互。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:text&#034;&gt;文件比较运算符

-e filename 	如果 filename存在，则为真 	[ -e /var/log/syslog ]
-d filename 	如果 filename为目录，则为真 	[ -d /tmp/mydir ]
-f filename 	如果 filename为常规文件，则为真 	[ -f /usr/bin/grep ]
-L filename 	如果 filename为符号链接，则为真 	[ -L /usr/bin/grep ]
-r filename 	如果 filename可读，则为真 	[ -r /var/log/syslog ]
-w filename 	如果 filename可写，则为真 	[ -w /var/mytmp.txt ]
-x filename 	如果 filename可执行，则为真 	[ -L /usr/bin/grep ]
filename1-nt filename2 	如果 filename1比 filename2新，则为真 	[ /tmp/install/etc/services -nt /etc/services ]
filename1-ot filename2 	如果 filename1比 filename2旧，则为真 	[ /boot/bzImage -ot arch/i386/boot/bzImage ]
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;for 循环中很容易遍历文件&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;for file in /home/*
do
   if [ -d &#034;$file&#034; ] 
   then
      echo $file is a directory
    fi
done&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;很容易调用其他程序的输出结果：&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;brush:bash&#034;&gt;for user in `awk -F&#034;:&#034; &#039;{ print $1 }&#039; /etc/passwd`
do
    echo find user $user
done&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;shell脚本中要使用其他命令的输出结果，只需用`符号把命令包含起来。注意：这个符号不是单引号，在键盘左上角那个位置。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;六. 后记&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;基本的shell语法就学了这些，高级的还没弄通。这篇笔记也差不多长了，别的再边学边写。shell是基础，要配合awk，grep，sed这些工具才能发挥出效果。最近在看《unix编程艺术》,上面谈到了*nix系统的几个哲学基础原则，其中有个原则就是：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;组合原则：设计时考虑拼接组合&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;*nix系统程序的的输入和输出一般都是简单，文本化，面向流的格式。这样便于程序和程序之间的交互和拼接。*nix系统下的程序一般都只完成单一功能，如果你需要要一个复杂的功能，那就需要把小程序拼接在一起。这一特征也决定了shell在*uix系统中的重要性。 &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;七.shell学习资料&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.&lt;a href=&#034;http://www.ibm.com/developerworks/cn/linux/shell/&#034; target=&#034;_blank&#034;&gt;IBM Shell编程系列&amp;nbsp; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt; 本文中的许多例子以及资料就是来自该系列教程&lt;/p&gt;
&lt;p&gt;2.&lt;a href=&#034;http://www.gnu.org/software/bash/manual/bash.html&#034; target=&#034;_blank&#034;&gt;Bash 参考手册&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gnu的bash官方参考手册&lt;/p&gt;&lt;p&gt;&lt;b&gt;Related Posts&lt;/b&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/11/13/1258074840000.html&#034;&gt;OpenSuse 11.2 正式发布&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/10/17/1255782360000.html&#034;&gt;Avidemux简易教程&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/10/20/1256005620000.html&#034;&gt;linux下的几款绘图(Flowchart,UML)软件&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/06/18/1245320460000.html&#034;&gt;Linux通过socks连接ssh服务器&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/04/10/1239304860000.html&#034;&gt;linux下文件名特殊符号导致的一个诡异问题&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2008/12/18/1229541300000.html&#034;&gt;mysqldump导出数据到mssql&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;
        </description>
      
      
    
    
    
    <category>脚本语言</category>
    
    <category>linux</category>
    
    <comments>http://jolestar.com/2008/04/06/1207420620000.html#comments</comments>
    <guid isPermaLink="true">http://jolestar.com/2008/04/06/1207420620000.html</guid>
    <pubDate>Sat, 05 Apr 2008 18:37:00 GMT</pubDate>
  </item>
  
  <item>
    <title>javascript获取网页元素的最终样式</title>
    <link>http://jolestar.com/2007/08/21/1187697600000.html</link>
    
      
        <description>
          &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 今天遇到个问题，用js获取网页元素的样式，如果直接用 document.getElementById(&#034;idname&#034;).style
获取的话，只能获取该元素的专有样式，即在该元素上直接用style=&amp;ldquo;&amp;rdquo;指定的样式，而无法获取由class设置的和从上级元素继承来的样式，也就是浏
览器生成dom后最终的样式，所以很头痛。网上搜索了一下，找到一个办法。&lt;/p&gt;
&lt;p&gt;
&lt;pre name=&#034;code&#034; class=&#034;html&#034;&gt;&amp;lt;html&amp;gt;  
   　　&amp;lt;head&amp;gt;  
   　　&amp;lt;style type=&#034;text/css&#034;&amp;gt;  
   　　div.special{  
   　　 background-color:red;  
   　　 height:50px;  
   　　 width:50px;  
   　　 margin:10px;  
   　　}  
  　　&amp;lt;/style&amp;gt;  
  　　&amp;lt;script language=&#034;JavaScript&#034;&amp;gt;  
  　　function getBackgroundColor()  
  　　{  
  　　 var oDiv=document.getElementById(&#034;div1&#034;);  
  　　 alert(oDiv.currentStyle.backgroundColor||document.defaultView.getComputedStyle(oDiv,null).backgroundColor);  
  　　}  
  　　&amp;lt;/script&amp;gt;  
  　　&amp;lt;/head&amp;gt;  
  　　&amp;lt;body&amp;gt;  
  　　&amp;lt;div id=&#034;div1&#034; class=&#034;special&#034;&amp;gt;&amp;lt;/div&amp;gt;  
  　　&amp;lt;input type=&#034;button&#034; value=&#034;Get Background Color&#034; onclick=&#034;getBackgroundColor()&#034;&amp;gt;  
      &amp;lt;/input&amp;gt;  
  　　&amp;lt;/body&amp;gt;  
  　　&amp;lt;/html&amp;gt;  &lt;/pre&gt;
&amp;nbsp;&lt;/p&gt;
&lt;p&gt;注意：oDiv.currentStyle.backgroundColor是IE使用的方法，document.defaultView.getComputedStyle(oDiv,null).backgroundColor是DOM使用的方法。 &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 内容来源：http://blog.tianya.cn/blogger/post_show.asp?BlogID=666817&amp;amp;PostID=7224874&amp;amp;idWriter=0&amp;amp;Key=0
  &lt;/p&gt;&lt;p&gt;&lt;b&gt;Related Posts&lt;/b&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/09/27/1254022980000.html&#034;&gt;微软对google说:不要把手伸到我媳妇怀里&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/05/09/1241883360000.html&#034;&gt;终于在网上建了个家&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/05/14/1242283440000.html&#034;&gt;javascript库的延迟加载&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/05/20/1242803580000.html&#034;&gt;Javascript(Ajax)开发测试工具&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/04/03/1238757420000.html&#034;&gt;Javascript对象中使用setTimeout和setInterval的问题&lt;/a&gt;&lt;br/&gt;&lt;a href=&#034;http://jolestar.com/2009/04/08/1239131820000.html&#034;&gt;css强制换行问题&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;
        </description>
      
      
    
    
    
    <category>html/css</category>
    
    <category>脚本语言</category>
    
    <comments>http://jolestar.com/2007/08/21/1187697600000.html#comments</comments>
    <guid isPermaLink="true">http://jolestar.com/2007/08/21/1187697600000.html</guid>
    <pubDate>Tue, 21 Aug 2007 12:00:00 GMT</pubDate>
  </item>
  
  <item>
    <title>JavaFX尝鲜</title>
    <link>http://jolestar.com/2007/07/30/1185733200000.html</link>
    
      
        <description>
          &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; java6出来以后，其一大特色就是对脚本语言的支持。以前只是粗略看了一下，没感觉到有什么具体的用处。最近又对java的特有脚本语言javaFX了解一下，感觉挺有意思。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;一.以下是几个相关网址: &lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 1.sun javafx 官方网站:.&lt;a href=&#034;http://www.sun.com/software/javafx/script/&#034;&gt;www.sun.com/software/javafx/script/&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 2.openjfx 网站:&amp;nbsp; &lt;a href=&#034;https://openjfx.dev.java.net/&#034;&gt;openjfx.dev.java.net/&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 3.JavaFX: First Steps - &#034;Hello OnJava&#034; App&amp;nbsp; &lt;a href=&#034;http://www.oreillynet.com/onjava/blog/2007/05/javafx_first_steps_hello_onjav_1.html&#034;&gt;www.oreillynet.com/onjava/blog/2007/05/javafx_first_steps_hello_onjav_1.html&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 4.&lt;a href=&#034;https://openjfx.dev.java.net/JavaFX_Programming_Language.html&#034;&gt;The JavaFX Script Programming Language Reference&lt;/a&gt; (&lt;a href=&#034;https://openjfx.dev.java.net/JavaFX_Programming_Language_CN.html&#034;&gt;Chinese version&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
hello world 式的程序，很简单，稍看一下文档就明白了。&lt;br /&gt;
&lt;strong&gt;二.我比较喜欢这个语言的下面几个特征:&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这个语言融合了javascript，php,actionscript,sql 等许多脚本语言的特征。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.&lt;strong&gt;数组操作很有特色&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var nums = [0..3];&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ..&amp;nbsp; 是范围表达式，上面的语句相当于&amp;nbsp; var nums == [0,1,2,3];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 数组支持类似于sql语句一样的查询表达式。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var nums = select n*n from n in [1..100];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 结果便是从1到100每个数字的平方组成的数组。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.&lt;strong&gt;字符串&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; javaFX中的字符串支持嵌入表达式&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;javafx&#034;&gt; var name = &#039;Joe&#039;;  
 var s = &#034;Hello {name}&#034;;  
System.out.println(s);  
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 程序在输出结果的时候会自动把字符串中的表达式 {} 算出来，替换成结果 。这段程序的输出结果是 : Hello Joe&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这个特点和php很相似。用在来做结果输出模板时很有用，不必用自己创造标签语法，输出的时候又得用正则分析，替换。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.&lt;strong&gt;类与对象&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 对象声明可以用一种类似于json的语法进行。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&#034;code&#034; class=&#034;javafx&#034;&gt;class Person {
 attribute name: String;
 attribute parent: Person inverse Person.children;
 attribute children: Person* inverse Person.parent;
 function getFamilyIncome(): Number;
 function getNumberOfChildren(): Number;
 operation marry(spouse: Person);
 }
 
var chris = Person {
name: &#034;Chris&#034;
children:
[Person {
name: &#034;Dee&#034;
},
Person {
name: &#034;Candice&#034;
}]
};
&lt;/pre&gt;
&amp;nbsp;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; 4.&lt;strong&gt;很有特色的反射操作&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; javaFX的反射很奇妙，我都在想，为什么java的反射也不做成这样。&lt;/p&gt;
&lt;div class=&#034;bar&#034;&gt;&amp;nbsp;
&lt;pre name=&#034;code&#034; class=&#034;javafx&#034;&gt; import java.lang.System;  
   
     System.out.println(1.class.Name) // prints &#034;Number&#034;  
     System.out.println(&#034;Hello&#034;.class.Name); // prints &#034;String&#034; &lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&#034;bar&#034;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&#034;bar&#034;&gt;方便吧？&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;
三.在web中的尝试。&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 看了说明，好像javaFX出现的目标是简化Swing的界面开发编程。一方面javaFX还没有一个好的所见即所得的ide支持，另外本人对web方面的编程比较感兴趣。所以进行了一个小实验。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我的思路是用一个servlet拦截所有对fx的请求，根据requestURI,获得javafx文件的绝对路径，然后在servelt中调用java6的脚本引擎，解释执行。&lt;br /&gt;
&amp;nbsp;FXServlet.java&lt;/div&gt;
&lt;div class=&#034;bar&#034;&gt;
&lt;pre name=&#034;code&#034; class=&#034;java&#034;&gt;import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleScriptContext;

public class FXServlet extends HttpServlet {

private String realPath;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

this.doWork(request, response);
}


public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

this.doWork(request, response);
}

public void doWork(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
System.out.println(&#034;begin ....&#034;);
 try {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
ScriptEngineManager manager = new ScriptEngineManager(loader);
ScriptEngine engine = manager.getEngineByExtension(&#034;fx&#034;);

Bindings bindings = engine.createBindings();
//将request和response两个对象传递给脚本引擎。
bindings.put(&#034;REQUEST:javax.servlet.http.HttpServletRequest&#034;,request);
bindings.put(&#034;RESPONSE:javax.servlet.http.HttpServletResponse&#034;,response);

ScriptContext context = new SimpleScriptContext();
context.setBindings(bindings, ScriptContext.GLOBAL_SCOPE);
context.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
engine.setContext(context);
String uri = request.getRequestURI();
String contextPath = request.getContextPath();
//将requestURI中的contextPath替换掉
if(contextPath!=null&amp;amp;&amp;amp;contextPath.trim().length()&amp;gt;0){
uri = uri.replaceAll(contextPath,&#034;&#034;);
}
//根据requestURI取得fx文件的绝对地址我们把fx文件放在站点的 WEB-INF下的 jfx目录下。
String filePath = this.realPath + &#034;WEB-INF&#034;+ File.separator +&#034;jfx&#034; + uri;
File jfxFile =new File(filePath);

if(!jfxFile.exists()){
response.sendError(404);
}else{
InputStreamReader reader = new InputStreamReader(new FileInputStream(jfxFile));
engine.eval(reader);
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(&#034;... end&#034;);
}

public void init() throws ServletException {
this.realPath = this.getServletContext().getRealPath(&#034;/&#034;);
}

}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&#034;bar&#034;&gt;web.xml&lt;/div&gt;
&lt;div class=&#034;bar&#034;&gt;
&lt;pre name=&#034;code&#034; class=&#034;xml&#034;&gt;    &amp;lt;?xml version=&#034;0&#034; encoding=&#034;UTF-8&#034;?&amp;gt;  
   &amp;lt;web-app version=&#034;4&#034;   
       xmlns=&#034;http://java.sun.com/xml/ns/j2ee&#034;   
       xmlns:xsi=&#034;http://www.worg/2001/XMLSchema-instance&#034;   
       xsi:schemaLocation=&#034;http://java.sun.com/xml/ns/j2ee   
       http://java.sun.com/xml/ns/j2ee/web-app_2_xsd&#034;&amp;gt;  
     &amp;lt;servlet&amp;gt;  
       &amp;lt;servlet-name&amp;gt;FXServlet&amp;lt;/servlet-name&amp;gt;  
       &amp;lt;servlet-class&amp;gt;net.teamhot.jfxweb.FXServlet&amp;lt;/servlet-class&amp;gt;  
    &amp;lt;/servlet&amp;gt;  
    
    &amp;lt;servlet-mapping&amp;gt;  
      &amp;lt;servlet-name&amp;gt;FXServlet&amp;lt;/servlet-name&amp;gt;  
      &amp;lt;url-pattern&amp;gt;*.fx&amp;lt;/url-pattern&amp;gt;  
    &amp;lt;/servlet-mapping&amp;gt;  
  &amp;lt;/web-app&amp;gt;  
&lt;/pre&gt;
&amp;nbsp;&lt;/div&gt;
&lt;div class=&#034;bar&#034;&gt;Hello.fx&lt;/div&gt;
&lt;div class=&#034;bar&#034;&gt;
&lt;pre name=&#034;code&#034; class=&#034;javafx&#034;&gt;import java.lang.System;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.PrintWriter;
 
 //接受从java中传递过来的参数
 var request:HttpServletRequest = REQUEST;
 var response:HttpServletResponse = RESPONSE;

var name = request.getParameter(&#034;name&#034;);
var out:PrintWriter = response.getWriter();

var template = &#034;Hello World!{if name ==null then &#039;guest&#039; else name}&#034;;

out.print(template);
&lt;/pre&gt;
&amp;nbsp;&lt;/div&gt;
&lt;div class=&#034;bar&#034;&gt;运行:http://localhost:8080/jfx/Hello.fx&lt;br /&gt;
结果:Hello World!guest&lt;br /&gt;
&lt;br /&gt;
运行:http://localhost:8080/jfx/Hello.fx?name=jolestar&lt;br /&gt;
结果:Hello World!jolestar&lt;br /&gt;
&lt;br /&gt;
注意:本程序需要tomcat在jdk6环境下运行，如果还是提示找不到&lt;span&gt;&lt;span&gt;javax.script.ScriptEngine，请将jdk6 lib 下面的rt.jar中的javax.script包抽取出来，重新打包后放到 tomcat&amp;nbsp; common lib 下面。&lt;br /&gt;
&lt;br /&gt;
这个程序没有考虑效率问题。其实这样的事情应该由容器完成，本人只是做了个小小的实验。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;Related Posts&lt;/b&gt;&lt;br/&gt;&lt;i&gt;There are no related posts for this blog entry&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;
        </description>
      
      
    
    
    
    <category>脚本语言</category>
    
    <comments>http://jolestar.com/2007/07/30/1185733200000.html#comments</comments>
    <guid isPermaLink="true">http://jolestar.com/2007/07/30/1185733200000.html</guid>
    <pubDate>Sun, 29 Jul 2007 18:20:00 GMT</pubDate>
  </item>
  
  </channel>
</rss>
