﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-以致宏大，以致高远-文章分类-Scripting language</title><link>http://www.cppblog.com/ewre/category/18246.html</link><description>knowing how to do is different from learning how to do</description><language>zh-cn</language><lastBuildDate>Mon, 13 May 2013 11:15:50 GMT</lastBuildDate><pubDate>Mon, 13 May 2013 11:15:50 GMT</pubDate><ttl>60</ttl><item><title>R 字符串操作</title><link>http://www.cppblog.com/ewre/articles/161234.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Wed, 30 Nov 2011 07:22:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161234.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161234.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161234.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161234.html</trackback:ping><description><![CDATA[<div>从COS统计论坛一个帖子的回复中抠出来的字符串操作总结：<br /><br />#字符串连接：<br />paste()&nbsp;#paste(...,&nbsp;sep&nbsp;=&nbsp;"&nbsp;",&nbsp;collapse&nbsp;=&nbsp;NULL)<br /><br />#字符串分割：<br />strsplit()&nbsp;#strsplit(x,&nbsp;split,&nbsp;extended&nbsp;=&nbsp;TRUE,&nbsp;fixed&nbsp;=&nbsp;FALSE,&nbsp;perl&nbsp;=&nbsp;FALSE)<br /><br />#计算字符串的字符数：<br />nchar()<br /><br />#字符串截取：<br />substr(x,&nbsp;start,&nbsp;stop)<br />substring(text,&nbsp;first,&nbsp;last&nbsp;=&nbsp;1000000)<br />substr(x,&nbsp;start,&nbsp;stop)&nbsp;&lt;-&nbsp;value<br />substring(text,&nbsp;first,&nbsp;last&nbsp;=&nbsp;1000000)&nbsp;&lt;-&nbsp;value<br /><br />#字符串替换及大小写转换：<br />chartr(old,&nbsp;new,&nbsp;x)<br />tolower(x)<br />toupper(x)<br />casefold(x,&nbsp;upper&nbsp;=&nbsp;FALSE)</div><img src ="http://www.cppblog.com/ewre/aggbug/161234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-30 15:22 <a href="http://www.cppblog.com/ewre/articles/161234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>R 文件操作</title><link>http://www.cppblog.com/ewre/articles/161229.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Wed, 30 Nov 2011 06:08:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161229.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161229.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161229.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161229.html</trackback:ping><description><![CDATA[R的文件操作（删除，新建等）大都以file.开头，如file.remove,file.create等等。<img src ="http://www.cppblog.com/ewre/aggbug/161229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-30 14:08 <a href="http://www.cppblog.com/ewre/articles/161229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux shell beginners</title><link>http://www.cppblog.com/ewre/articles/161165.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161165.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161165.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161165.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161165.html</trackback:ping><description><![CDATA[<div><span style="font-size: 16px;"><br /> 习惯ｃ语言的同志们，写linux script 的时候请注意小细节<br /> <br /> 1, 流程控制语句的条件判断部分方括号后面：请加空格</span> <span style="font-size: 16px;"><br /> 例如</span><span style="font-size: 16px;"><br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">if空格[空格</span><span style="color: #800080; ">$aa</span><span style="color: #000000; ">&nbsp;lt&nbsp;num空格]<br />then<br />code&nbsp;segment<br /></span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />code&nbsp;segment<br />fi</span></div><span style="font-size: 16px;"> 2,关于shell解释器<br /></span><p><span style="font-size: 16px;"> 有时候shell解释器会引起麻烦(这种麻烦来自于有时你并不想让shell解释一些字符)</span></p><p><span style="font-size: 16px;"> 先说一下metacharachter（元字符）：一个含有多重意义的字符被称为元字符，这种字符通常不仅仅包含其自身的字面意思。bash   shell有自己的一套metacharachter，并有相应的解释机制。正则表达式系统也有自己的元字符和相应的解释机制，通  常，这些元字符标准是一致的，但是不排除不一致的情况。</span></p><p><span style="font-size: 16px;"> bash grep要求在匹配时给出一个pattern，如果此pattern是一个正则表达式，则有可能携带有shell 的metacharacter。</span></p><p><span style="font-size: 16px;"> 这里情况就变得比较复杂，下面分类：</span></p><p><span style="font-size: 16px;"> 1，如果该字符是shell metacharachter，同时，在正则表达式里面有其特殊含义，then：</span></p><p><span style="font-size: 16px;"> 首先记得用strong quoting把这个pattern括起来以防止shell试图对其进行解释而得到不希望得到的结果，其次正确的利用正则表达式本身的机制表达你想要得到的结果（转义，反义，锚定，重复，模糊匹配等等烂七八糟的东西）</span></p><p><span style="font-size: 16px;"> 2，如果该字符不是shell metacharacter，但是正则表达式的元字符，括不括就随你的便了，但是注意正确表达正则表达式</span></p><p><span style="font-size: 16px;"> 3，如果该字符是shell metacharachter，而不是正则表达式的元字符，请你把它括起来防止shell解释器解释。</span></p><p><span style="font-size: 16px;"> 关于以上说法最明显的例子是grep 匹配\字符的情况，正确的写法是：</span></p><p><span style="font-size: 16px;"> grep '\\' sourcefile</span></p><p><span style="font-size: 16px;"> 如果写成 grep \\ 或者grep "\\"</span></p><p><span style="font-size: 16px;"> shell会提示：grep：末尾的斜杠，这说明shell解释器对pattern进行了解释，并把解释后的结果（这里是\）递给了grep，grep接到参数后认为这是一个元字符（逃逸字符）并且没有被转义，是非法的，所以会报错。</span></p><p><span style="font-size: 16px;"> 如果写成grep '\'</span></p><p><span style="font-size: 16px;"> shell同样提示：grep:末尾的斜杠，这是因为shell虽然不解释\，但是参数\传给grep以后仍然认为这是一个元字符。</span></p><p><span style="font-size: 16px;"> 若果写成 grep \ sourcefile</span></p><p><span style="font-size: 16px;"> bash shell会停止响应，猜测是因为bash不知道你要grep什么东西了</span></p><p><span style="font-size: 16px;"></span></p><span style="font-size: 16px;"> <br /></span><p><span style="font-size: 16px;"> 要说明的是：</span> <span style="font-size: 16px;"></span></p><p><span style="font-size: 16px;"> 强弱quoting的区别在于：</span></p><p><span style="font-size: 16px;"> 弱quoting（一对双引号）里面的$,\等少数几个字符仍然被shell解释，其余metacharachter不被解释</span></p><p><span style="font-size: 16px;"> 强quoting（一对单引号）里面的元字符均不被解释，包括$，\在内。</span></p><p><span style="font-size: 16px;"> </span></p><p><span style="font-size: 16px;"> 这里写一个匹配的小例子：</span> <span style="font-size: 16px;"></span></p><p><span style="font-size: 16px;"> human&lt;tab&gt;sfuhojhfa&lt;tab&gt;human</span></p><p><span style="font-size: 16px;"> human&lt;tab&gt;dlfuil;djsfikdsf&lt;tab&gt;mouse</span></p><p><span style="font-size: 16px;"> rat&lt;tab&gt;ldfkuaselkt;lkfg&lt;tab&gt;human</span></p><p><span style="font-size: 16px;"> 对于以上文本，要找出两个human中间加一段字符串的行，可以这么写：</span></p><p><span style="font-size: 16px;"> human.*human</span></p><p><span style="font-size: 16px;"> 以上是我对shell grep的理解，有错误还请斧正</span></p></div><img src ="http://www.cppblog.com/ewre/aggbug/161165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:45 <a href="http://www.cppblog.com/ewre/articles/161165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注意返回值和输出的区别</title><link>http://www.cppblog.com/ewre/articles/161164.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161164.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161164.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161164.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161164.html</trackback:ping><description><![CDATA[<div>对于一个函数func（），<br /> 如果它会向标准输出输出一些内容A，如果func执行成功她还会返回0，不成功会返回1，那么<br /> 若你令<br /> <em>aa</em>=func（），aa的值是0或者1，也就是func（）的返回值，而不是它的输出A。<br /> <br /> 由于shell提供了非常强大的文本处理能力，这些文本处理的结果大多以标准输出的形式输出。<br /> 所以你也许经常把送到标准输出的东西和函数的返回值弄混，请注意。</div><img src ="http://www.cppblog.com/ewre/aggbug/161164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:45 <a href="http://www.cppblog.com/ewre/articles/161164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于R的append</title><link>http://www.cppblog.com/ewre/articles/161158.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:41:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161158.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161158.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161158.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161158.html</trackback:ping><description><![CDATA[<div>R的append：<br /> append(x,y,after=)<br /> append函数将y黏到x上，并且返回粘好后的对象。<br /> 这里要说明的是，这个函数不改变x里面的内容，只是将粘好的内容以返回值得形式返回，不要被迷惑哦。<br /></div><img src ="http://www.cppblog.com/ewre/aggbug/161158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:41 <a href="http://www.cppblog.com/ewre/articles/161158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于shell的字符串处理以及由此引出的shell相比于其他语言的特性</title><link>http://www.cppblog.com/ewre/articles/161156.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:40:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161156.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161156.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161156.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161156.html</trackback:ping><description><![CDATA[<div>首先，我把shell提供的字符串处理工具分为两大类：变量相关工具和流相关工具。<p>&nbsp;&nbsp;&nbsp; 解释一下，变量相关工具就是处理变量用的，输出结果也可以被保存在新变量当中，这和其他语言如c，perl等的字符串处理颇为相似。</p><p>&nbsp;&nbsp;&nbsp; 例如：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str="hello shell"</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root$ new_str=${str:2}</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root$ echo $new_str&nbsp;&nbsp;&nbsp;&nbsp; ##输出为llo shell</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于变量相关工具的详细信息，可以参阅这里<a target="_blank" href="http://blog.csdn.net/zg_hover/archive/2008/12/15/3523303.aspx">http://blog.csdn.net/zg_hover/archive/2008/12/15/3523303.aspx</a></p><p>&nbsp;&nbsp;&nbsp; 流相关工具的输入输出对象为&#8220;流&#8221;，这类的工具有sed，grep，awk，cut等。通过管道符可以实现输入输出流的重定向以及实现各种操作，这一类工具给人的最突出的感觉是以文件为编程元素，可以方便直接的操作文件而不考虑细节。</p><p>&nbsp;&nbsp;&nbsp; 例如：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root$ cat file1| cut&nbsp; -f3 &gt;SelectedFiled.txt&nbsp;&nbsp;&nbsp; ##将file1中的内容以tab制表符分成列，并取出第3列写入文件SelectedFiled.txt中</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，流相关工具也可以做字符串操作：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root$ str="hello world"</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root$ echo $str | cut -d" " -f2&nbsp;&nbsp;&nbsp; ##将&#8220;world&#8221;字符以标准输出流的形式发送的终端屏幕</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里echo的作用就是将字符串变量&#8220;包装&#8221;成输入流，因为流相关工具只能作用于流。</p><p>&nbsp;&nbsp;&nbsp;&nbsp; 流相关操作可以看看O&#8216;REILY 的bash shell编程书籍。</p></div><img src ="http://www.cppblog.com/ewre/aggbug/161156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:40 <a href="http://www.cppblog.com/ewre/articles/161156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux shell-当用read，echo处理tab delimited文本的时候</title><link>http://www.cppblog.com/ewre/articles/161155.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:39:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161155.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161155.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161155.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161155.html</trackback:ping><description><![CDATA[<div><p><span style="font-size: 18px;">&nbsp; 在用shell进行字符串截断时常常会出现一些意想不到的状况，总结了以下，大部分情况是使用的echo命令导致的。</span></p><p><span style="font-size: 18px;">&nbsp;&nbsp; cat,read等命令读入tab delimited文本，然后用echo输出的时候，文本里面的tab会变成space空格，所以在你尝试以tab为分隔符分割文本的时候要特别注意这种情况。</span></p></div><img src ="http://www.cppblog.com/ewre/aggbug/161155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:39 <a href="http://www.cppblog.com/ewre/articles/161155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux chmod</title><link>http://www.cppblog.com/ewre/articles/161154.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:38:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161154.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161154.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161154.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161154.html</trackback:ping><description><![CDATA[<div><p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体; color: red;">命令格式：</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod&nbsp;[-cfvR]&nbsp;[--help]&nbsp;[--version]&nbsp;<span style="color: red;">mode</span>&nbsp;file... <br /><br /></span></span></span></p> <p><span style="font-family: 宋体; font-size: small;">[root@qs-wg-db2 ~]# chmod --help</span></p> <p><span style="font-family: 宋体; font-size: small;">Usage: chmod [OPTION]... MODE[,MODE]... FILE...</span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;">&nbsp;or:&nbsp;chmod [OPTION]... OCTAL-MODE FILE...</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;">&nbsp;or:&nbsp;chmod [OPTION]... --reference=RFILE FILE...</span></span></p> <p><span style="font-family: 宋体; font-size: small;">Change the mode of each FILE to MODE.</span></p> <p>&nbsp;</p> <p><span style="font-size: small;"><span style="font-family: 宋体;">&nbsp;-c, --changes<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; like verbose but report only when a change is made</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --no-preserve-root&nbsp;do not treat `/' specially (the default)</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --preserve-root&nbsp;&nbsp;&nbsp;&nbsp; fail to operate recursively on `/'</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;">&nbsp;-f, --silent, --quiet<span>&nbsp;&nbsp; suppress most error messages</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;">&nbsp;-v, --verbose<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output a diagnostic for every file processed</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --reference=RFILE&nbsp;&nbsp; use RFILE's mode instead of MODE values</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;">&nbsp;-R, --recursive<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; change files and directories recursively</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --help&nbsp;&nbsp;&nbsp;&nbsp; display this help and exit</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --version&nbsp;output version information and exit</span></span></span></p> <p>&nbsp;</p> <p><span style="font-size: small;"><span style="font-family: 宋体;">Each MODE is of the form<span style="color: red;"> `[ugoa]*([-+=]([rwxXst]*|[ugo]))+'.</span></span></span></p> <p>&nbsp;</p> <p><span style="font-family: 宋体; font-size: small;">Report bugs to &lt;bug-coreutils@gnu.org&gt;.</span></p> <p><span style="font-family: 宋体; font-size: small;">[root@qs-wg-db2 ~]#</span></p> <p>&nbsp;</p> <p>&nbsp;</p> <p><span style="font-family: 宋体;"><span style="font-family: 宋体; color: red; font-size: 14pt;">参数说明：</span></span></p> <p><span style="font-family: 宋体;"><span style="color: red; font-size: 14pt;">1. -cfvR </span><span style="font-family: 宋体; color: red; font-size: 14pt;">部分</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -c&nbsp;:&nbsp;</span><span style="font-family: 宋体;">若该档案权限确实已经更改，才显示其更改动作</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -f&nbsp;:&nbsp;</span><span style="font-family: 宋体;">若该档案权限无法被更改也不要显示错误讯息</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -v&nbsp;:&nbsp;</span><span style="font-family: 宋体;">显示权限变更的详细资料</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -R&nbsp;:&nbsp;</span><span style="font-family: 宋体;">对目前目录下的所有档案与子目录进行相同的权限变更</span>(<span style="font-family: 宋体;">即以递回的方式逐个变更</span>)<span style="font-family: 宋体;">，</span> <span style="font-family: 宋体; color: red;">这个</span><span style="color: red;">-R </span><span style="font-family: 宋体; color: red;">用的还是很多的。</span></span></span></p> <p>&nbsp;</p> <p><span style="font-family: 宋体;"><span style="color: red; font-size: 14pt;">2. &nbsp;Mode </span><span style="font-family: 宋体; color: red; font-size: 14pt;">部分</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">这部分可以分成如下</span>3<span style="font-family: 宋体;">块：</span> [who] operator [permission] </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">`[ugoa]*([-+=]([rwxXst]*|[ugo]))+'.</span></span></span></span></p> <p>&nbsp;</p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="color: red;">who</span><span style="font-family: 宋体; color: red;">的含义是：</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u </span><span style="font-family: 宋体;">文件属主权限</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g </span><span style="font-family: 宋体;">同组用户权限</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o </span><span style="font-family: 宋体;">其它用户权限</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a </span><span style="font-family: 宋体;">所有用户（包括以上三种）</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="color: red;">operator</span><span style="font-family: 宋体; color: red;">的含义：</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + </span><span style="font-family: 宋体;">增加权限</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - </span><span style="font-family: 宋体;">取消权限</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = &nbsp;</span><span style="font-family: 宋体;">唯一设定权限</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="color: red;">permission</span><span style="font-family: 宋体; color: red;">的含义：</span><span style="color: red;"> </span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r </span><span style="font-family: 宋体;">读权限</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w </span><span style="font-family: 宋体;">写权限</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x </span><span style="font-family: 宋体;">执行权限</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X&nbsp;</span><span style="font-family: 宋体;">表示只有当该档案是个子目录或者该档案已经被设定过为可执行。</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s </span><span style="font-family: 宋体;">文件属主和组</span>id </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l </span><span style="font-family: 宋体;">给文件加锁，使其它用户无法访问</span> </span></span></p> <p>&nbsp;</p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">如</span>: chmod a+x </span></span></p> <p>&nbsp;</p> <p><span style="font-family: 宋体;"><span style="color: red; font-size: 14pt;">3. </span><span style="font-family: 宋体; color: red; font-size: 14pt;">示例：</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">（</span>1<span style="font-family: 宋体;">）将档案</span>&nbsp;file1.txt&nbsp;<span style="font-family: 宋体;">设为所有人皆可读取</span>&nbsp;: </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod&nbsp;ugo+r&nbsp;file1.txt&nbsp; </span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">（</span>2<span style="font-family: 宋体;">）将档案</span>&nbsp;file1.txt&nbsp;<span style="font-family: 宋体;">设为所有人皆可读取</span>&nbsp;: </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod&nbsp;a+r&nbsp;file1.txt&nbsp; <br /></span><span style="font-family: 宋体;">（</span>3<span style="font-family: 宋体;">）将档案</span>&nbsp;file1.txt&nbsp;<span style="font-family: 宋体;">与</span>&nbsp;file2.txt&nbsp;<span style="font-family: 宋体;">设为该档案拥有者，与其所属同一个群体者可写入，但其他以外的人则不可写入</span>&nbsp;: </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod&nbsp;ug+w,o-w&nbsp;file1.txt&nbsp;file2.txt&nbsp; </span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">（</span>4<span style="font-family: 宋体;">）将</span>&nbsp;ex1.py&nbsp;<span style="font-family: 宋体;">设定为只有该档案拥有者可以执行</span>&nbsp;: </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod&nbsp;u+x&nbsp;ex1.py&nbsp; </span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">（</span>5<span style="font-family: 宋体;">）将目前目录下的所有档案与子目录皆设为任何人可读取</span>&nbsp;: </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod&nbsp;-R&nbsp;a+r&nbsp;*&nbsp; </span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">（</span>6<span style="font-family: 宋体;">）收回所有用户的对</span>file1<span style="font-family: 宋体;">的执行权限</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod a-x file1</span></span></span></p> <p>&nbsp;</p> <p><span style="font-family: 宋体;"><span style="color: red; font-size: 14pt;">4. </span><span style="font-family: 宋体; color: red; font-size: 14pt;">使用数字来赋权</span></span></p> <p>&nbsp;</p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="color: red;">4.1 </span><span style="font-family: 宋体; color: red;">先看一下文件的权限格式</span></span></span></p> <p>&nbsp;</p> <p><span style="font-family: 宋体; font-size: small;">[root@qs-wg-db2 scripts]# ll</span></p> <p><span style="font-family: 宋体; font-size: small;">total 20</span></p> <p><span style="font-family: 宋体; font-size: small;">-rw-r--r-- 1 oracle oinstall<span>&nbsp;&nbsp;&nbsp; 0 Feb 24 00:00 alertlogbyday.log</span></span></p> <p><span style="font-family: 宋体; font-size: small;">-rwxr-xr-x 1 oracle oinstall&nbsp;430 Feb 20 01:10 alertlogbyday.sh</span></p> <p><span style="font-family: 宋体; font-size: small;">-rwxr-xr-x 1 oracle oinstall<span>&nbsp;&nbsp;&nbsp; 7 Feb 24 05:00 del_st_arch.log</span></span></p> <p><span style="font-family: 宋体; font-size: small;">-rwxr-xr-x 1 oracle oinstall&nbsp;648 Feb 19 00:51 del_st_archive.sh</span></p> <p><span style="font-family: 宋体; font-size: small;">-rwxr-xr-x 1 oracle oinstall<span>&nbsp;&nbsp;&nbsp; 9 Feb 24 05:00 max_sn.log</span></span></p> <p><span style="font-family: 宋体; font-size: small;">drwxr-xr-x 3 root<span>&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp; 4096 Feb 23 23:40 pymonitor</span></span></p> <p>&nbsp;</p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="color: red;">ll</span><span style="font-family: 宋体; color: red;">的结果返回七列，分别表示如下含义：</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">第一栏</span>&nbsp;&nbsp;[<span style="font-family: 宋体;">文件属性</span>]</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">第二栏</span>&nbsp;&nbsp;[<span style="font-family: 宋体;">文件数</span>]</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">第三栏</span>&nbsp;&nbsp;[<span style="font-family: 宋体;">拥有者</span>]</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">第四栏</span>&nbsp;&nbsp;[<span style="font-family: 宋体;">所有者群组</span>]</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">第五栏</span>&nbsp;&nbsp;[<span style="font-family: 宋体;">大小</span>]</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">第六栏</span>&nbsp;&nbsp;[<span style="font-family: 宋体;">建档日期</span>]</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">第七栏</span>&nbsp;&nbsp;[<span style="font-family: 宋体;">档名</span>]</span></span></p> <p>&nbsp;</p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体; color: red;">我们设置文件的权限就是这是第一栏里的文件属性。</span></span></span></p> <p>&nbsp;</p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">文件属性这块共有十个字段，如：</span>drwxr-xr-x</span></span></p> <p>&nbsp;</p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体; color: red;">我们把这</span><span style="color: red;">10</span><span style="font-family: 宋体; color: red;">个列分成</span><span style="color: red;">4</span><span style="font-family: 宋体; color: red;">块：</span><span style="color: red;">[d] [rwx] [r-x] [r-x]</span></span></span></p> <p><span style="font-family: 宋体;"><span style="font-family: 宋体; font-size: small;">第一块：也就是第一列，用来表示这个文件的类型，有如下值：</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">（</span>1<span style="font-family: 宋体;">）</span>[ d ]<span style="font-family: 宋体;">则是目录，我这里的是</span>d<span style="font-family: 宋体;">，表示的是一个目录</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">（</span>2<span style="font-family: 宋体;">）</span>[ - ]<span style="font-family: 宋体;">则是文件；</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">（</span>3<span style="font-family: 宋体;">）</span>[ l ]<span style="font-family: 宋体;">则表示为连结档</span>(link file)<span style="font-family: 宋体;">；</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">（</span>4<span style="font-family: 宋体;">）</span>[ b ]<span style="font-family: 宋体;">则表示为装置文件里面的可供储存的接口设备；</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">（</span>5<span style="font-family: 宋体;">）</span>[ c ]<span style="font-family: 宋体;">则表示为装置文件里面的串行端口设备，例如键盘、鼠标。</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">第二块：第</span> 2<span style="font-family: 宋体;">到</span>4 <span style="font-family: 宋体;">列，表示文件拥有者的权限。</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">第三块：第</span>5<span style="font-family: 宋体;">到</span>7 <span style="font-family: 宋体;">列，表示拥有者同组人的权限。</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">第四块：第</span>8<span style="font-family: 宋体;">到</span>10<span style="font-family: 宋体;">列，表示是非拥有者组人的权限。</span></span></span></p> <p>&nbsp;</p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">这些权限均有</span>[rwx] <span style="font-family: 宋体;">三个参数表示，而且分别对应不同的位置。每块由</span>3<span style="font-family: 宋体;">个列组成，每列对应一个值。</span> [ r ]<span style="font-family: 宋体;">代表可读、</span>[ w ]<span style="font-family: 宋体;">代表可写、</span>[ x ]<span style="font-family: 宋体;">代表可执行。</span> </span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">举例：</span> <span style="font-family: 宋体;">如果拥有者只有只读的权限，那么第</span>2<span style="font-family: 宋体;">到</span>4<span style="font-family: 宋体;">列就是</span>[r--],<span style="font-family: 宋体;">有读写的权限就是</span>[rw-],<span style="font-family: 宋体;">有读写和执行的权利就是</span>[rwx].</span></span></p> <p>&nbsp;</p> <p><span style="font-family: 宋体;"><span style="color: red; font-size: 14pt;">4.2 </span><span style="font-family: 宋体; color: red; font-size: 14pt;">使用数字赋权</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体;">在</span>4.1 <span style="font-family: 宋体;">中了解准备知识之后，就可以使用数字赋权了。</span> <span style="font-family: 宋体; color: red;">每块用户有</span><span style="color: red;">3</span><span style="font-family: 宋体; color: red;">个权限</span><span style="color: red;">[rwx]. </span><span style="font-family: 宋体;">他们对应数字：</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r --&gt;4</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w--&gt;2</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x--&gt;1</span></span></span></p> <p>&nbsp;</p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体; color: red;">使用数字赋权的命令格式如下：</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod abc filename</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span style="font-family: 宋体; color: red;">其中的</span><span style="color: red;">abc </span><span style="font-family: 宋体; color: red;">分别代表</span><span style="color: red;">3</span><span style="font-family: 宋体; color: red;">个数字，并且分别对应问个不同的属组</span><span style="font-family: 宋体;">。</span> <span style="font-family: 宋体;">即：</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">数字</span>a <span style="font-family: 宋体;">对应</span> <span style="font-family: 宋体;">第</span>2<span style="font-family: 宋体;">到</span>4<span style="font-family: 宋体;">位，表示拥有者的权限。</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">数字</span>b <span style="font-family: 宋体;">对应</span> <span style="font-family: 宋体;">第</span>5<span style="font-family: 宋体;">到</span>7<span style="font-family: 宋体;">位，表示同组用户的权限。</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">数字</span>c <span style="font-family: 宋体;">对应第</span>8<span style="font-family: 宋体;">到</span>10<span style="font-family: 宋体;">位，表示其他组的权限。</span></span></span></p> <p>&nbsp;</p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rwx </span><span style="font-family: 宋体;">对应</span>4<span style="font-family: 宋体;">，</span>2<span style="font-family: 宋体;">，</span>1. <span style="font-family: 宋体;">那么只读的权限用</span>4<span style="font-family: 宋体;">表示</span>[r--]<span style="font-family: 宋体;">，读写用</span>6<span style="font-family: 宋体;">（</span>4+2<span style="font-family: 宋体;">）表示</span>[rw-],<span style="font-family: 宋体;">写加执行用</span>7<span style="font-family: 宋体;">（</span>4+2+1<span style="font-family: 宋体;">）表示</span>[rwx]<span style="font-family: 宋体;">。</span> <span style="font-family: 宋体;">只读加执行用</span>5<span style="font-family: 宋体;">（</span>4+1<span style="font-family: 宋体;">）表示</span>[r-x]<span style="font-family: 宋体;">。</span></span></span></p> <p>&nbsp;</p> <p><span style="font-family: 宋体;"><span style="font-family: 宋体; color: red; font-size: 14pt;">示例：</span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod 755 file1</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod 777 file1 &lt;==&gt; chmod&nbsp;a=rwx&nbsp;file&nbsp;</span></span></span></p> <p><span style="font-size: small;"><span style="font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod&nbsp;771&nbsp;file&nbsp; &lt;==&gt; chmod&nbsp;ug=rwx,o=x&nbsp;file&nbsp; <br /></span></span></span></p><p><span style="font-size: small;"><span style="font-family: 宋体;">以上内容参考自</span></span><a target="_blank" href="http://blog.csdn.net/tianlesoftware/archive/2011/02/24/6204412.aspx">http://blog.csdn.net/tianlesoftware/archive/2011/02/24/6204412.aspx</a>，转载注明出处。</p></div><img src ="http://www.cppblog.com/ewre/aggbug/161154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:38 <a href="http://www.cppblog.com/ewre/articles/161154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>R read.table函数注意事项</title><link>http://www.cppblog.com/ewre/articles/161153.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:38:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161153.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161153.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161153.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161153.html</trackback:ping><description><![CDATA[<div><p>read.table函数在读入文件时，文件中不能含有"/"字符(linux,MS-DOS with "\" I guess)，否则会引起不必要的麻烦.</p></div><img src ="http://www.cppblog.com/ewre/aggbug/161153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:38 <a href="http://www.cppblog.com/ewre/articles/161153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell 中变量解释相关的符号</title><link>http://www.cppblog.com/ewre/articles/161152.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161152.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161152.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161152.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161152.html</trackback:ping><description><![CDATA[<div><p>首先是 ${},它表示变量。</p><p>在括号中作相应的变换可以起到相应的变量操作的效果，如果想表示&#8220;变量加上一些固定的字符&#8221;，可以</p><p>这样写：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root$ ${variable}charactersYouWant，这表示名为variablecharactersYouWant的那个变量</p><p>其次是$()和反单引号``。</p><p>它们一般用来得到被作用的命令的结果。常用于循环语句中：</p><p>for file in `ls -a`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ####或者写成$(ls -a)</p><p>do</p><p>echo $file</p><p>done</p><p>将输出当前目录下所有文件和文件夹的名称</p></div><img src ="http://www.cppblog.com/ewre/aggbug/161152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:37 <a href="http://www.cppblog.com/ewre/articles/161152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux disk usage command-du</title><link>http://www.cppblog.com/ewre/articles/161151.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161151.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161151.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161151.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161151.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161151.html</trackback:ping><description><![CDATA[<div><p>$ man du</p><p><br />NAME<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; du - estimate file space usage<br /><br />SYNOPSIS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; du [OPTION]... [FILE]...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; du [OPTION]... --files0-from=F<br /><br />DESCRIPTION<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Summarize disk usage of each FILE, recursively for directories.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mandatory arguments to long options are mandatory for short options too.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -a, --all<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write counts for all files, not just directories<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --apparent-size<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print&nbsp; apparent&nbsp; sizes,&nbsp; rather than disk usage; although the apparent  size is usually smaller, it may be larger due to holes in ('sparse')  files, internal fragmenta-<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tion, indirect blocks, and the like<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -B, --block-size=SIZE use SIZE-byte blocks<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -b, --bytes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; equivalent to '--apparent-size --block-size=1'<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -c, --total<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; produce a grand total<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -D, --dereference-args<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dereference FILEs that are symbolic links<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --files0-from=F<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; summarize disk usage of the NUL-terminated file names specified in file F<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -H&nbsp;&nbsp;&nbsp;&nbsp; like --si, but also evokes a warning; will soon change to be equivalent to --dereference-args (-D)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -h, --human-readable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print sizes in human readable format (e.g., 1K 234M 2G)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --si&nbsp;&nbsp; like -h, but use powers of 1000 not 1024<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -k&nbsp;&nbsp;&nbsp;&nbsp; like --block-size=1K<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -l, --count-links<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count sizes many times if hard linked<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -m&nbsp;&nbsp;&nbsp;&nbsp; like --block-size=1M<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -L, --dereference</p><p>&nbsp;</p><p>如果想以G为单位显示当前文件夹下的文件及文件夹大小：</p><p>$ du -a -B g . (或者 du -sh .)</p>2G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057636_2.fastq<br />5G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057631.fastq.sam<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057638_1.fastq<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057638_2.fastq<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057639_1.fastq<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057639_2.fastq<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057640_1.fastq<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057640_2.fastq<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057641_1.fastq<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057641_2.fastq<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057642_1.fastq<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057642_2.fastq<br />4G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057643_2.fastq<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057644_2.fastq<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057645_2.fastq<br />3G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057646_2.fastq<br />2G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057647_2.fastq<br />2G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057629.fastq.sam<br />1G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./SRR057632.fastq.sam<br />128G&nbsp;&nbsp;&nbsp; .</div> <div id="haloword-lookup" class="ui-widget-content ui-draggable"><div id="haloword-title"><span id="haloword-word"></span><a herf="#" id="haloword-pron" class="haloword-button" title="发音"></a><audio id="haloword-audio"></audio><div id="haloword-control-container"><a herf="#" id="haloword-add" class="haloword-button" title="加入单词表"></a><a herf="#" id="haloword-remove" class="haloword-button" title="移出单词表"></a><a href="#" id="haloword-open" class="haloword-button" title="查看单词详细释义" target="_blank"></a><a herf="#" id="haloword-close" class="haloword-button" title="关闭查询窗"></a></div></div><div id="haloword-content"></div></div><img src ="http://www.cppblog.com/ewre/aggbug/161151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:37 <a href="http://www.cppblog.com/ewre/articles/161151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转贴：linux shell中的括号</title><link>http://www.cppblog.com/ewre/articles/161149.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161149.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161149.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161149.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161149.html</trackback:ping><description><![CDATA[<div><p>我一下子也想不起该起什么标题，就取了这样一个不太合适的标题。<br /> 在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量，命令的用法，如下：</p><div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 114px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #0000bb;">1.</span><span style="color: #007700;">${var} <br /></span><span style="color: #0000bb;">2.</span><span style="color: #007700;">$(</span><span style="color: #0000bb;">cmd</span><span style="color: #007700;">) <br /></span><span style="color: #0000bb;">3.</span><span style="color: #007700;">()</span><span style="color: #0000bb;">和</span><span style="color: #007700;">{} <br /></span><span style="color: #0000bb;">4.</span><span style="color: #007700;">${var:-</span><span style="color: #0000bb;">string</span><span style="color: #007700;">},${var:+</span><span style="color: #0000bb;">string</span><span style="color: #007700;">},${var:=</span><span style="color: #0000bb;">string</span><span style="color: #007700;">},${var:?</span><span style="color: #0000bb;">string</span><span style="color: #007700;">} <br /></span><span style="color: #0000bb;">5.</span><span style="color: #007700;">$((</span><span style="color: #0000bb;">exp</span><span style="color: #007700;">)) <br /></span><span style="color: #0000bb;">6.</span><span style="color: #007700;">$(var%</span><span style="color: #0000bb;">pattern</span><span style="color: #007700;">),$(var%%</span><span style="color: #0000bb;">pattern</span><span style="color: #007700;">),$(var</span><span style="color: #ff8000;">#pattern),$(var##pattern)&nbsp; <br /></span> </span> </code>   </div>     </div> </div>现在分述如下：<br /> 1.Shell中变量的原形：${var}<br /> 大家常见的变量形式都是$var,如<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 66px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;var=</span><span style="color: #0000bb;">test <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$var <br />test&nbsp; <br /></span> </span> </code>   </div>     </div> </div> 但当你要显示变量值加随意的字符(我这里用AA)时，就会出错，如下：<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 66px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$varAA <br /> <br /></span><span style="color: #007700;">$&nbsp; <br /></span> </span> </code>   </div>     </div> </div> 这时应该用变量的原形：${var}，即是加一个大括号来限定变量名称的范围，如下<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 66px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;echo&nbsp;${var}</span><span style="color: #0000bb;">AA <br />testAA <br /></span><span style="color: #007700;">$&nbsp; <br /></span> </span> </code>   </div>     </div> </div> 以这个特性，我们可以很方便地写一个批量改后缀名的程序，我把它命名为mymv，程序如下：<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 130px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #ff8000;">#!/bin/bash <br />&nbsp; <br /></span><span style="color: #0000bb;">tail</span><span style="color: #007700;">=$</span><span style="color: #0000bb;">1 <br /></span><span style="color: #007700;">for&nbsp;</span><span style="color: #0000bb;">filename&nbsp;in&nbsp;</span><span style="color: #007700;">`</span><span style="color: #0000bb;">ls</span><span style="color: #007700;">` <br />do <br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb;">mv&nbsp;$filename&nbsp;</span><span style="color: #007700;">${</span><span style="color: #0000bb;">filename</span><span style="color: #007700;">}.</span><span style="color: #0000bb;">$tail <br />done&nbsp; <br /></span> </span> </code>   </div>     </div> </div> 程序需要提供一个后缀名，如c，表示改为后缀为c的C程序文件，看下面的测试：<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 114px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;</span><span style="color: #0000bb;">ls <br />a&nbsp;b&nbsp;c <br /></span><span style="color: #007700;">$&nbsp;</span><span style="color: #0000bb;">mymv&nbsp;c <br /></span><span style="color: #007700;">$&nbsp;</span><span style="color: #0000bb;">ls <br />a</span><span style="color: #007700;">.</span><span style="color: #0000bb;">c&nbsp;b</span><span style="color: #007700;">.</span><span style="color: #0000bb;">c&nbsp;c</span><span style="color: #007700;">.</span><span style="color: #0000bb;">c <br /></span><span style="color: #007700;">$&nbsp; <br /></span> </span> </code>   </div>     </div> </div> 看样子程序运行的很好，但这是不完善的程序，有2个要注意的问题：<br /> A,目录下没有子目录，如果有一个目录，假设为dir，则也会被改为dir.c，这显然不是我们想要的，应该修正这个程序能识别目录。<br /> B,没有帮助对程序的参数进行处理，程序应该足够友好，在用户没有给定后缀名时应能处理，像上面的将直接给文件加上了一个点(.),这显然也不是我们想要的。<br /> <br /> 因为我们的目的是说明${var}，这样已经足够了，因此这里不会再对上面的程序进行修正。<br /> <br /> 2.命令替换$(cmd)<br /> 命令替换$(cmd)和符号`cmd`(注意这不是单引号，在美式键盘上，`是ESC下面的那个键)有相同之处<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 114px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;</span><span style="color: #0000bb;">ls <br />a&nbsp;b&nbsp;c <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;$(</span><span style="color: #0000bb;">ls</span><span style="color: #007700;">) <br /></span><span style="color: #0000bb;">a&nbsp;b&nbsp;c <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;`</span><span style="color: #0000bb;">ls</span><span style="color: #007700;">` <br /></span><span style="color: #0000bb;">a&nbsp;b&nbsp;c&nbsp; <br /></span> </span> </code>   </div>     </div> </div> 我们来分析一下命令echo $(ls)，以便理解所谓命令替换是什么意思：<br /> shell扫描一遍命令行，发现了$(cmd)结构，便将$(cmd)中的cmd执行一次，得到其标准输出，再将此输出放到原来命令echo $(ls)中的$(ls)位置，即替换了$(ls),再执行echo命令。<br /> 如下：<br /> echo $(ls)被替换成了echo a b c<br /> 这里要注意的是$(cmd)中的命令的错误输出是不会被替换的，替换的只是标准输出：<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 98px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;var=$(</span><span style="color: #0000bb;">cat&nbsp;d</span><span style="color: #007700;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###文件d在当前目录不存在 <br /></span><span style="color: #0000bb;">cat</span><span style="color: #007700;">:&nbsp;</span><span style="color: #0000bb;">d</span><span style="color: #007700;">:&nbsp;</span><span style="color: #0000bb;">没有那个文件或目录 <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$var <br /> <br /></span><span style="color: #007700;">$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###显然var变量的值是空的&nbsp; <br /></span> </span> </code>   </div>     </div> </div> 3.一串的命令执行()和{}<br /> ()和{}都是对一串的命令进行执行，但有所区别：<br /> A,()只是对一串命令重新开一个子shell进行执行<br /> B,{}对一串命令在当前shell执行<br /> C,()和{}都是把一串的命令放在括号里面，并且命令之间用;号隔开<br /> D,()最后一个命令可以不用分号<br /> E,{}最后一个命令要用分号<br /> F,{}的第一个命令和左括号之间必须要有一个空格<br /> G,()里的各命令不必和括号有空格<br /> H,()和{}中括号里面的某个命令的重定向只影响该命令，但括号外的重定向则影响到括号里的所有命令<br /> <br /> 我们来看几个例子：<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 290px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;var=</span><span style="color: #0000bb;">test <br /></span><span style="color: #007700;">$&nbsp;(var=</span><span style="color: #0000bb;">notest</span><span style="color: #007700;">;&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$var</span><span style="color: #007700;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###变量var值为notest，此是在子shell中有效 <br /></span><span style="color: #0000bb;">notest <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$var&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###父shell中值仍为test <br /></span><span style="color: #0000bb;">test <br /></span><span style="color: #007700;">$&nbsp;{&nbsp;var=</span><span style="color: #0000bb;">notest</span><span style="color: #007700;">;&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$var</span><span style="color: #007700;">;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###注意左括号和var之间要有一个空格 <br /></span><span style="color: #0000bb;">notest <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$var&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###父shell中的var变量的值变为了notest <br /></span><span style="color: #0000bb;">notest <br /></span><span style="color: #007700;">$&nbsp;{&nbsp;</span><span style="color: #0000bb;">var1</span><span style="color: #007700;">=</span><span style="color: #0000bb;">test1</span><span style="color: #007700;">;</span><span style="color: #0000bb;">var2</span><span style="color: #007700;">=</span><span style="color: #0000bb;">test2</span><span style="color: #007700;">;echo&nbsp;</span><span style="color: #0000bb;">$var1</span><span style="color: #007700;">&gt;</span><span style="color: #0000bb;">a</span><span style="color: #007700;">;echo&nbsp;</span><span style="color: #0000bb;">$var2</span><span style="color: #007700;">;}&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###输出test1被重定向到文件a中， <br /></span><span style="color: #0000bb;">test2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###而test2输出则仍输出到标准输出中。 <br /></span><span style="color: #007700;">$&nbsp;</span><span style="color: #0000bb;">cat&nbsp;a <br />test1 <br /></span><span style="color: #007700;">$&nbsp;{&nbsp;</span><span style="color: #0000bb;">var1</span><span style="color: #007700;">=</span><span style="color: #0000bb;">test1</span><span style="color: #007700;">;</span><span style="color: #0000bb;">var2</span><span style="color: #007700;">=</span><span style="color: #0000bb;">test2</span><span style="color: #007700;">;echo&nbsp;</span><span style="color: #0000bb;">$var1</span><span style="color: #007700;">;echo&nbsp;</span><span style="color: #0000bb;">$var2</span><span style="color: #007700;">;}&gt;</span><span style="color: #0000bb;">a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###括号内命令的标准输出全部被重定向到文件a中 <br /></span><span style="color: #007700;">$&nbsp;</span><span style="color: #0000bb;">cat&nbsp;a <br />test1 <br />test2&nbsp; <br /></span> </span> </code>   </div>     </div> </div> 4,几种特殊的替换结构：${var:-string},${var:+string},${var:=string},${var:?string}<br /> A,${var:-string}和${var:=string}<br /> 若变量var为空，则用在命令行中用string来替换${var:-string}，否则变量var不为空时，则用变量var的值来替换${var:-string}<br /> 如：<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 178px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">newvar <br /> <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">:-</span><span style="color: #0000bb;">a</span><span style="color: #007700;">} <br /></span><span style="color: #0000bb;">a <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">newvar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###变量newvar的值仍然是空，但上一命令行中${newvar:-a}被替换成了a <br /> <br /></span><span style="color: #007700;">$&nbsp;</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">=</span><span style="color: #0000bb;">b <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">:-</span><span style="color: #0000bb;">a</span><span style="color: #007700;">}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###变量newvar的值不为空时，此命令行中的${newvar:-b}被替换为$newvar，即b <br /></span><span style="color: #0000bb;">b <br /></span><span style="color: #007700;">$&nbsp; <br /></span> </span> </code>   </div>     </div> </div> 对于${var:=string}的替换规则和${var:-string}是一样的，所不同之处是${var:=string}若var为空时，用string替换${var:=string}的同时，把string赋给变量var：<br /> <br /> <div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 178px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">newvar <br /> <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">:=</span><span style="color: #0000bb;">a</span><span style="color: #007700;">} <br /></span><span style="color: #0000bb;">a <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">newvar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###变量newvar被赋值为a，同时${newvar:=a}被替换成a <br /></span><span style="color: #0000bb;">a <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">:=</span><span style="color: #0000bb;">b</span><span style="color: #007700;">}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000;">###变量newvar不为空(其值已被赋为a)，则${newvar:=b}被替换为newvar的值(即b) <br /></span><span style="color: #0000bb;">a <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$newvar <br />a&nbsp; <br /></span> </span> </code>   </div>     </div> </div> ${var:=string}很常用的一种用法是，判断某个变量是否赋值，没有的话则给它赋上一个默认值。<br /> 如设置默认的编辑器：<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 34px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">echo&nbsp;</span><span style="color: #0000bb;">You&nbsp;</span><span style="color: #007700;">use&nbsp;</span><span style="color: #0000bb;">editor</span><span style="color: #007700;">:&nbsp;${</span><span style="color: #0000bb;">EDITOR</span><span style="color: #007700;">:=/</span><span style="color: #0000bb;">bin</span><span style="color: #007700;">/</span><span style="color: #0000bb;">vi</span><span style="color: #007700;">}&nbsp; <br /></span> </span> </code>   </div>     </div> </div> B,${var:+string}<br /> ${var:+string}的替换规则和上面的相反，即只有当var不是空的时候才替换成string，若var为空时则不替换或者说是替换成变量 var的值，即空值。(因为变量var此时为空，所以这两种说法是等价的)<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 178px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$newvar <br />a <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">:+</span><span style="color: #0000bb;">b</span><span style="color: #007700;">} <br /></span><span style="color: #0000bb;">b <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$newvar <br />a <br /></span><span style="color: #007700;">$&nbsp;</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">= <br />$&nbsp;echo&nbsp;${</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">:+</span><span style="color: #0000bb;">b</span><span style="color: #007700;">} <br /> <br />$&nbsp; <br /></span> </span> </code>   </div>     </div> </div> C,${var:?string}<br /> 替换规则为：若变量var不为空，则用变量var的值来替换${var:?string}；若变量var为空，则把string输出到标准错误中，并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 130px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">= <br />$&nbsp;echo&nbsp;${</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">:?</span><span style="color: #0000bb;">没有设置newvar的值</span><span style="color: #007700;">} <br /></span><span style="color: #0000bb;">bash</span><span style="color: #007700;">:&nbsp;</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">:&nbsp;</span><span style="color: #0000bb;">没有设置newvar的值 <br /></span><span style="color: #007700;">$&nbsp;</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">=</span><span style="color: #0000bb;">a <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${</span><span style="color: #0000bb;">newvar</span><span style="color: #007700;">:?</span><span style="color: #0000bb;">没有设置newvar的值</span><span style="color: #007700;">} <br /></span><span style="color: #0000bb;">a <br /></span><span style="color: #007700;">$&nbsp; <br /></span> </span> </code>   </div>     </div> </div>补充扩展：在上面这五种替换结构中string不一定是常值的，可用另外一个变量的值或是一种命令的输出。<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 146px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;echo&nbsp;${var:-`</span><span style="color: #0000bb;">date</span><span style="color: #007700;">`} <br /></span><span style="color: #0000bb;">日&nbsp;3月&nbsp;6&nbsp;02</span><span style="color: #007700;">:</span><span style="color: #0000bb;">10</span><span style="color: #007700;">:</span><span style="color: #0000bb;">39&nbsp;CST&nbsp;2005 <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${var:-$(</span><span style="color: #0000bb;">date</span><span style="color: #007700;">)} <br /></span><span style="color: #0000bb;">日&nbsp;3月&nbsp;6&nbsp;02</span><span style="color: #007700;">:</span><span style="color: #0000bb;">11</span><span style="color: #007700;">:</span><span style="color: #0000bb;">46&nbsp;CST&nbsp;2005 <br /></span><span style="color: #007700;">$&nbsp;</span><span style="color: #0000bb;">a</span><span style="color: #007700;">=</span><span style="color: #0000bb;">test <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${var:-</span><span style="color: #0000bb;">$a</span><span style="color: #007700;">} <br /></span><span style="color: #0000bb;">test <br /></span><span style="color: #007700;">$&nbsp; <br /></span> </span> </code>   </div>     </div> </div> 5.POSIX标准的扩展计算:$((exp))<br /> 这种计算是符合C语言的运算符，也就是说只要符合C的运算符都可用在$((exp))，甚至是三目运算符。<br /> 注意：这种扩展计算是整数型的计算，不支持浮点型.若是逻辑判断，表达式exp为真则为1,假则为0。<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 290px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;echo&nbsp;$((</span><span style="color: #0000bb;">3</span><span style="color: #007700;">+</span><span style="color: #0000bb;">2</span><span style="color: #007700;">)) <br /></span><span style="color: #0000bb;">5 <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;$((</span><span style="color: #0000bb;">3</span><span style="color: #007700;">&gt;</span><span style="color: #0000bb;">2</span><span style="color: #007700;">)) <br /></span><span style="color: #0000bb;">1 <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;$((</span><span style="color: #0000bb;">25</span><span style="color: #007700;">&lt;</span><span style="color: #0000bb;">3&nbsp;</span><span style="color: #007700;">?&nbsp;</span><span style="color: #0000bb;">2</span><span style="color: #007700;">:</span><span style="color: #0000bb;">3</span><span style="color: #007700;">)) <br /></span><span style="color: #0000bb;">3 <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$var <br /> <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;$((var=</span><span style="color: #0000bb;">2</span><span style="color: #007700;">+</span><span style="color: #0000bb;">3</span><span style="color: #007700;">)) <br /></span><span style="color: #0000bb;">5 <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$var <br />5 <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;$((var++)) <br /></span><span style="color: #0000bb;">5 <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;</span><span style="color: #0000bb;">$var <br />6 <br /></span><span style="color: #007700;">$&nbsp; <br /></span> </span> </code>   </div>     </div> </div> 好了，上面的例子足够了，这也表明了这种扩展运算是很强大的。<br /> <br /> 6.四种模式匹配替换结构：${var%pattern},${var%%pattern},${var#pattern},${var##pattern}<br /> 这四种结构的意义是：${var%pattern}和${var%%pattern}表示从最右边(即结尾)匹配的，${var#pattern} 和${var##pattern}从最左边(即开头)匹配的。其中${var%pattern}和${var#pattern}是最短匹 配，${var%%pattern}和${var##pattern}是最长匹配。只有在pattern中使用了通配符才能有最长最短的匹配，否则没有最 长最短匹配之分。<br /> <br /> 结构中的pattern支持通配符，*表示零个或多个任意字符，?表示零个或一个任意字符，[...]表示匹配中括号里面的字符，[!...]表示不匹配中括号里面的字符。<div style="margin: 5px 20px 20px 0px;">  <div style="margin-bottom: 2px;">代码:</div>  <div style="margin: 0px; padding: 4px; border: 1px solid #c6c6c6; width: 640px; height: 306px; overflow: auto;">   <code style="white-space: nowrap;">   </code><div dir="ltr">    <code><span style="color: #000000;"> <span style="color: #007700;">$&nbsp;var=</span><span style="color: #0000bb;">aabbbccbbdbb <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${var%</span><span style="color: #0000bb;">b</span><span style="color: #007700;">} <br /></span><span style="color: #0000bb;">aabbbccbbdb <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${var%%</span><span style="color: #0000bb;">b</span><span style="color: #007700;">} <br /></span><span style="color: #0000bb;">aabbbccbbdb <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${var</span><span style="color: #ff8000;">#a} <br /></span><span style="color: #0000bb;">abbbccbbdbb <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${var</span><span style="color: #ff8000;">##a} <br /></span><span style="color: #0000bb;">abbbccbbdbb <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${var%*</span><span style="color: #0000bb;">b</span><span style="color: #007700;">} <br /></span><span style="color: #0000bb;">aabbbccbbdb <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${var%%*</span><span style="color: #0000bb;">b</span><span style="color: #007700;">} <br /> <br />$&nbsp;echo&nbsp;${var</span><span style="color: #ff8000;">#a*} <br /></span><span style="color: #0000bb;">abbbccbbdbb <br /></span><span style="color: #007700;">$&nbsp;echo&nbsp;${var</span><span style="color: #ff8000;">##a*} <br /> <br /></span><span style="color: #007700;">$&nbsp; <br /></span> </span> </code>   </div>     </div> </div><p> 上面是简单的例举四种模式匹配替换结构的用法。</p><p>以上内容为转贴，<a target="_blank" href="http://www.linuxsir.org/bbs/showthread.php?t=180140">出处:http://www.linuxsir.org/bbs/showthread.php?t=180140</a></p></div><img src ="http://www.cppblog.com/ewre/aggbug/161149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:36 <a href="http://www.cppblog.com/ewre/articles/161149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转贴：linux shell中重定向</title><link>http://www.cppblog.com/ewre/articles/161148.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161148.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161148.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161148.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161148.html</trackback:ping><description><![CDATA[<div><p style="text-indent: 2em;"><strong>I/O重定向详解及应用实例 </strong></p><p style="text-indent: 2em;">1、 基本概念（这是理解后面的知识的前提，请务必理解） </p><p style="text-indent: 2em;">a、 I/O重定向通常与 FD有关，shell的FD通常为10个，即 0～9； </p><p style="text-indent: 2em;">b、 常用FD有3个，为0（stdin，标准输入）、1（stdout，标准输出）、2（stderr，标准错误输出），默认与keyboard、monitor、monitor有关； </p><p style="text-indent: 2em;">c、 用 &lt; 来改变读进的数据信道(stdin)，使之从指定的档案读进； </p><p style="text-indent: 2em;">d、 用 &gt; 来改变送出的数据信道(stdout, stderr)，使之输出到指定的档案； </p><p style="text-indent: 2em;">e、 0 是 &lt; 的默认值，因此 &lt; 与 0&lt;是一样的；同理，&gt; 与 1&gt; 是一样的； </p><p style="text-indent: 2em;">f、 在IO重定向 中，stdout 与 stderr 的管道会先准备好，才会从 stdin 读进资料； </p><p style="text-indent: 2em;">g、 管道&#8220;|&#8221;(pipe line):上一个命令的 stdout 接到下一个命令的 stdin; </p><p style="text-indent: 2em;">h、 tee 命令是在不影响原本 I/O 的情况下，将 stdout 复制一份到档案去; </p><p style="text-indent: 2em;">i、 bash（ksh）执行命令的过程：分析命令－变量求值－命令替代（``和$( )）－重定向－通配符展开－确定路径－执行命令； </p><p style="text-indent: 2em;">j、  ( ) 将 command group 置于 sub-shell 去执行，也称 nested  sub-shell，它有一点非常重要的特性是：继承父shell的Standard input, output, and error plus  any other open file descriptors。 </p><p style="text-indent: 2em;">k、 exec 命令：常用来替代当前 shell 并重新启动一个 shell，换句话说，并没有启动子 shell。使用这一命令时任何现有环境都将会被清除。exec 在对文件描述符进行操作的时候，也只有在这时，exec 不会覆盖你当前的 shell 环境。 </p><p style="text-indent: 2em;"><strong>2、 基本IO </strong></p><p style="text-indent: 2em;">cmd &gt; file 把 stdout 重定向到 file 文件中； </p><p style="text-indent: 2em;">cmd &gt;&gt; file 把 stdout 重定向到 file 文件中(追加)； </p><p style="text-indent: 2em;">cmd 1&gt; fiel 把 stdout 重定向到 file 文件中； </p><p style="text-indent: 2em;">cmd &gt; file 2&gt;&amp;1 把 stdout 和 stderr 一起重定向到 file 文件中； </p><p style="text-indent: 2em;">cmd 2&gt; file 把 stderr 重定向到 file 文件中； </p><p style="text-indent: 2em;">cmd 2&gt;&gt; file 把 stderr 重定向到 file 文件中(追加)； </p><p style="text-indent: 2em;">cmd &gt;&gt; file 2&gt;&amp;1 把 stderr 和 stderr 一起重定向到 file 文件中(追加)； </p><p style="text-indent: 2em;">cmd &lt; file &gt;file2 cmd 命令以 file 文件作为 stdin，以 file2 文件作为 stdout； </p><p style="text-indent: 2em;">cat &lt;&gt;file 以读写的方式打开 file； </p><p style="text-indent: 2em;">cmd &lt; file cmd 命令以 file 文件作为 stdin； </p><p style="text-indent: 2em;">cmd &lt;&lt; delimiter Here document，从 stdin 中读入，直至遇到 delimiter 分界符。 </p><p style="text-indent: 2em;"><strong>3、 进阶IO</strong> </p><p style="text-indent: 2em;">&gt;&amp;n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出； </p><p style="text-indent: 2em;">&lt;&amp;n 标准输入复制自文件描述符 n； </p><p style="text-indent: 2em;">&lt;&amp;- 关闭标准输入（键盘）； </p><p style="text-indent: 2em;">&gt;&amp;- 关闭标准输出； </p><p style="text-indent: 2em;">n&lt;&amp;- 表示将 n 号输入关闭； </p><p style="text-indent: 2em;">n&gt;&amp;- 表示将 n 号输出关闭； </p><p style="text-indent: 2em;">上述所有形式都可以前导一个数字，此时建立的文件描述符由这个数字指定而不是缺省的 0 或 1。如： </p><p style="text-indent: 2em;">... 2&gt;file 运行一个命令并把错误输出(文件描述符 2)定向到 file。 </p><p style="text-indent: 2em;">... 2&gt;&amp;1 运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ，但效果通常是合并了两个流。) </p><p style="text-indent: 2em;">我 们对 2&gt;&amp;1详细说明一下 ：2&gt;&amp;1 也就是 FD2＝FD1 ，这里并不是说FD2 的值 等于FD1的值，因为  &gt; 是改变送出的数据信道，也就是说把 FD2 的 &#8220;数据输出通道&#8221; 改为 FD1 的  &#8220;数据输出通道&#8221;。如果仅仅这样，这个改变好像没有什么作用，因为 FD2 的默认输出和 FD1的默认输出本来都是 monitor，一样的！  但是，当 FD1 是其他文件，甚至是其他 FD 时，这个就具有特殊的用途了。请大家务必理解这一点。 </p><p style="text-indent: 2em;">exec 0exec 1&gt;outfilename # 打开文件outfilename作为stdout。 </p><p style="text-indent: 2em;">exec 2&gt;errfilename # 打开文件 errfilename作为 stderr。 </p><p style="text-indent: 2em;">exec 0&lt;&amp;- # 关闭 FD0。 </p><p style="text-indent: 2em;">exec 1&gt;&amp;- # 关闭 FD1。 </p><p style="text-indent: 2em;">exec 5&gt;&amp;- # 关闭 FD5。 </p><p style="text-indent: 2em;">问： 如果关闭了 FD0、FD1、FD2，其后果是什么？ 恢复 FD0、FD1、FD2与 关闭FD0、FD1、FD2 有什么区别？代码分别是什么？ 打开了FD3～FD9，我们用完之后，你觉得是将他们关闭还是恢复？ </p><p style="text-indent: 2em;">下面是提示（例子来源于CU一帖子，忘记出处，来日再补上）： </p><center><table align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td style="font-size: 9pt;" bgcolor="#e6e6e6"><pre>exec 6&gt;&amp;2 2&gt;ver <br />command &gt;&gt;dev/null &amp; <br />exec 2&gt;&amp;6 # 恢复 FD2</pre></td></tr></tbody></table></center><p style="text-indent: 2em;"><strong>4、 简单举例</strong> </p><p style="text-indent: 2em;">a、stdout和stderr都通过管道送给egrep了： </p><center><table align="center" border="1" cellpadding="2" cellspacing="0" height="65" width="400"><tbody><tr><td style="font-size: 9pt;" bgcolor="#e6e6e6"><pre>(ls you no 2&gt;&amp;1;ls yes 2&gt;&amp;1) 2&gt;&amp;1|egrep \* &gt;file <br />(ls you no 2&gt;&amp;1;ls yes 2&gt;&amp;1)|egrep \* &gt;file <br />(ls you no;ls yes) 2&gt;&amp;1|egrep \* &gt;file</pre></td></tr></tbody></table></center><p style="text-indent: 2em;">这个例子要注意的就是： </p><p style="text-indent: 2em;">理 解 命令执行顺序 和 管道&#8220;|&#8221;：在命令执行前，先要进行重定向的处理，并将把 nested sub-shell 的stdout 接到 egrep  命令的 stdin。 nested sub-shell ，在 ( ) 中的两个命令加上（），可以看作一个命令。其 FD1  已经连接到&#8220;|&#8221;往egrep送了，当遇到 2&gt;&amp;1时，也就是FD2＝FD1，即FD2同FD1一样，往管道 &#8220;|&#8221;那边送。 </p><p style="text-indent: 2em;">b、 没有任何东西通过管道送给egrep，全部送往monitor。 (ls you no 2&gt;&amp;1;ls yes  2&gt;&amp;1) &gt;&amp;2|egrep \* &gt;file。虽然在（）里面将 FD2转往FD1，但在（）外，遇到  &gt;&amp;2 ，结果所有的都送到monitor。 请理解： </p><p>(ls you no 2&gt;&amp;1) 1&gt;&amp;2|egrep \* &gt;file ## 送到 monitor  ls you no 2&gt;&amp;1 1&gt;&amp;2|egrep \* &gt;file ## 送给 管道 &#8220;|&#8221;  ls you no 1&gt;&amp;2 2&gt;&amp;1|egrep \* &gt;file ## 送到 monitor</p><p style="text-indent: 2em;"><strong>5、 中阶例子</strong> </p><p style="text-indent: 2em;">条件： stderr通过管道送给egrep，正确消息仍然送给monitor（不变） </p><center><table align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td style="font-size: 9pt;" bgcolor="#e6e6e6"><pre>exec 4&gt;&amp;1;(ls you no 2&gt;&amp;1 1&gt;&amp;4 4&gt;&amp;-;ls yes 2&gt;&amp;1 1&gt;<br />&amp;4 4&gt;&amp;-)|egrep \* &gt;file;exec 4&gt;&amp;- <br />或者 <br />exec 4&gt;&amp;1;(ls you no;ls yes) 2&gt;&amp;1 1&gt;<br />&amp;4 4&gt;&amp;-|egrep \* &gt;file;exec 4&gt;&amp;-</pre></td></tr></tbody></table></center><p style="text-indent: 2em;">如果加两个条件： </p><p style="text-indent: 2em;">（1）要求cmd1和cmd2并行运行； </p><p style="text-indent: 2em;">（2）将cmd1的返回值赋给变量 ss。 </p><p style="text-indent: 2em;">则为： </p><center><table align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td style="font-size: 9pt;" bgcolor="#e6e6e6"><pre>exec 3&gt;&amp;1;exec 4&gt;&amp;1 <br />ss=$(((ls you no 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-;echo $? &gt;&amp;4)|egrep \* &gt;file) 4&gt;&amp;1) <br />exec 3&gt;&amp;-;exec 4&gt;&amp;-</pre></td></tr></tbody></table></center><p style="text-indent: 2em;">说明： </p><p style="text-indent: 2em;">exec  3&gt;&amp;1;4&gt;&amp;1 建立FD3，是用来将下面ls那条语句（子shell）中的FD1  恢复到正常FD1，即输出到monitor，你可以把FD3看作最初始的FD1的硬盘备份（即输出到monitor）；建立FD4，到时用作保存ls的返 回值（echo $?），你可以将FD4看作你考试时用于存放计算&#8220;echo $?&#8221;的草稿纸； </p><p style="text-indent: 2em;">(ls  you no 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-;echo $? &gt;&amp;4)  大家还记得前面说的子shell和管道吧。这条命令首先会继承FD0、FD1、FD2、FD3、FD4，它位于管道前，所以在运行命令前会先把子 shell自己的FD1和管道&#8220;|&#8221;相连。但是我们的条件是stderr通过管道送往egrep，stdout仍然输出到monitor。  于是通过2&gt;&amp;1，先把 子shell的FD1 的管道&#8220;送给&#8221;FD2，于是子shell中的stderr送往管道&#8220;|&#8221;；再通过  1&gt;&amp;3，把以前的&#8220;硬盘备份&#8221;恢复给子shell的FD1，于是子shell中的FD1变成送到monitor了。再通过 3&gt;&amp;- ，将3关闭；接着运行echo $? ，本来其输出值应该送往管道的，通过 &gt;&amp;4 ，将 输出 送往  &#8220;草稿纸&#8221;FD4，留以备用。 </p><p style="text-indent: 2em;">((ls you no 2&gt;&amp;1  1&gt;&amp;3 3&gt;&amp;-;echo $? &gt;&amp;4)|egrep \* &gt;file) 于是，stderr  通过管道送给 egrep ，stdout 送给monitor，但是，还有 FD4，它送到哪去了？ $(((ls you no  2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-;echo $? &gt;&amp;4)|egrep \*  &gt;file) 4&gt;&amp;1)最后的 4&gt;&amp;1 ，就是把FD4 重定向到 FD1。但由于其输出在 $(  )中，其值就赋给变量ss了。最后一行关闭 FD3、FD4。 </p><p style="text-indent: 2em;"><strong>6、 高阶例子 </strong></p><p style="text-indent: 2em;">命令 cmd1, cmd2, cmd3, cmd4. 如何利用单向管道完成下列功能： </p><p style="text-indent: 2em;">1. 所有命令并行执行。 </p><p style="text-indent: 2em;">2. cmd1 和 cmd2 不需要 stdin。 </p><p style="text-indent: 2em;">3. cmd1 和 cmd2 的 stdout 定向到 cmd3 的 stdin。 </p><p style="text-indent: 2em;">4. cmd1 和 cmd2 的 stderr 定向到 cmd4 的 stdin。 </p><p style="text-indent: 2em;">5. cmd3 的 stdout 定向到文件 a, stderr 定向到屏幕。 </p><p style="text-indent: 2em;">6. cmd4 的 stdout 定向到文件 b, stderr 定向到屏幕。 </p><p style="text-indent: 2em;">7. cmd1 的返回码赋给变量 s。 </p><p style="text-indent: 2em;">8. 不能利用临时文件。 </p><p style="text-indent: 2em;">解决方法： </p><center><table align="center" border="1" cellpadding="2" cellspacing="0" height="83" width="469"><tbody><tr><td style="font-size: 9pt;" bgcolor="#e6e6e6"><pre>exec 3&gt;&amp;1; exec 4&gt;&amp;1 <br />s=$(((((cmd1 1&gt;&amp;3 ; echo $? &gt;&amp;4 )| cmd2 ) 3&gt;<br />&amp;1 | cmd3 &gt;a 2&gt;&amp;3 ) 2&gt;&amp;1 | cmd4 &gt;b ) 4&gt;&amp;1) <br />exec 3&gt;&amp;-; exec 4&gt;&amp;-</pre></td></tr></tbody></table></center><p style="text-indent: 2em;">这 个我一步步解释（好复杂，自己感觉看明白了，过一会再看，大脑仍然有几分钟空白～～～，没想到我也能看明白。exec 3&gt;&amp;1;  exec 4&gt;&amp;1 前面的例子都有说明了，就是建立FD3 ，给cmd1恢复其FD1用和给cmd3  恢复其FD2用，建立FD4，保存&#8220;echo $?&#8221;输出值的&#8220;草稿纸&#8221;。 </p><p style="text-indent: 2em;">第一对 括号：(cmd1 1&gt;&amp;3 ; echo $? &gt;&amp;4 )  和其后（第一个）管道。在第一个括号（子shell）中，其FD1已经连到 管道中了，所以用 FD3 将  FD1恢复正常，不让他往管道跑；这里的cmd1没有stdin，接着将 cmd1 运行的返回码 保存到 FD4 中。 </p><p style="text-indent: 2em;">第 二对括号：((cmd1 1&gt;&amp;3 ; echo $? &gt;&amp;4 )| cmd2 ) 3&gt;&amp;1  和其后（第二个）管道。前面的 FD1 已经不送给 cmd2了，FD2 默认也不送过来，所以cmd2 也没有stdin  ，所以在第二对括号里面：cmd1和cmd2 的stdout、stderr 为默认输出，一直遇到  &#8220;3&gt;&amp;1&#8221;为止。请注意：&#8220;3&gt;&amp;1&#8221;，先将第二对括号看出一个命令，他们遇到 第二个管道时，其FD1 连到 管道  &#8220;|&#8221;，由于&#8220;3&gt;&amp;1&#8221;的作用，子shell的FD1 送给FD3 使用，所以所有FD3 的输出都  &#8220;流往&#8221;cmd3，又由于继承关系（继承第一行的命令），FD3实际上就是cmd1和cmd2的stdout，于是&#8220; cmd1 和 cmd2 的  stdout 定向到 cmd3 的 stdin&#8221; </p><p style="text-indent: 2em;">第三对括号：(((cmd1  1&gt;&amp;3 ; echo $? &gt;&amp;4 )| cmd2 ) 3&gt;&amp;1 | cmd3 &gt;a  2&gt;&amp;3 ) 2&gt;&amp;1 和其后的第三个管道。cmd1 和 cmd2 的 stdout 已经定向到 cmd3 的  stdin，处理之后，cmd3 &gt;a 意味着将其 stdout 送给 a  文件。而2&gt;&amp;3的意思是：恢复cmd3的错误输出为FD3，即送往 monitor。于是&#8220;cmd3 的 stdout 定向到文件  a, stderr  定向到屏幕&#8221;。如果没有&#8220;2&gt;&amp;3&#8221;，那么cmd3的错误输出就会干扰cmd1和cmd2的错误输出，所以它是必须的！请注意第三对括号后 的 &#8220;2&gt;&amp;1&#8221;| ，其子shell的FD1 本来连接着管道&#8220;|&#8221;，但子shell FD1 慷慨大方，送给了 FD2，于是FD2  连接着管道。还记得前面的 cmd1 和 cmd2 吗？他们的stderr一直没动了。于是在这里，通过管道送给了 第四个命令cmd4  了。即&#8220;cmd1 和 cmd2 的 stderr 定向到 cmd4 的 stdin&#8221;。后面就比较简单了。cmd4 &gt;b 表示&#8220;cmd4 的  stdout 定向到文件 b, stderr 定向到屏幕（默认）&#8221; </p><p style="text-indent: 2em;">第四对括 号：((((cmd1 1&gt;&amp;3 ; echo $? &gt;&amp;4 )| cmd2 ) 3&gt;&amp;1 | cmd3  &gt;a 2&gt;&amp;3 ) 2&gt;&amp;1 | cmd4 &gt;b ) 与其后的 4&gt;&amp;1。四对括号里面的  FD1、FD2都处理完了。但是还记得前面&#8220;echo $?  &gt;&amp;4&#8221;那块&#8220;草稿纸&#8221;吗？&#8220;4&gt;&amp;1&#8221;的作用就是&#8220;将草稿纸上的内容送给monitor&#8221;，但是由于最外面还有 $()  将其&#8220;包着&#8221;。于是其值赋给变量&#8220;s&#8221;。 </p><p style="text-indent: 2em;"><a target="_blank" href="http://www.xxlinux.com/linux/article/development/shell/2006-10-16/5018.html">出处：http://www.xxlinux.com/linux/article/development/shell/2006-10-16/5018.html</a></p></div><img src ="http://www.cppblog.com/ewre/aggbug/161148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:36 <a href="http://www.cppblog.com/ewre/articles/161148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell 运算</title><link>http://www.cppblog.com/ewre/articles/161147.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161147.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161147.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161147.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161147.html</trackback:ping><description><![CDATA[<div><p>Bash shell 的算术运算有四种方式:<br /><strong>1：使用 expr 外部程式</strong></p> <p>加法 r=`expr 4 + 5`<br />echo $r<br />注意! '4' '+' '5' 这三者之间要有空白<br />r=`expr 4 * 5`  #错误<br />乘法 r=`expr 4 \* 5`</p> <p><strong>2：使用 $(( ))<br /></strong>r=$(( 4 + 5 ))<br />echo $r</p> <p><strong>3：使用 $[ ]</strong></p> <p>r=$[ 4 + 5 ]<br />echo $r</p> <p>乘法<br />r=`expr 4 \* 5` <br />r=$(( 4 * 5 ))<br />r=$[ 4 * 5 ]<br />echo $r</p> <p>除法<br />r=`expr 40 / 5` <br />r=$(( 40 / 5 ))<br />r=$[ 40 / 5 ]<br />echo $r</p> <p>减法<br />r=`expr 40 - 5` <br />r=$(( 40 - 5 ))<br />r=$[ 40 - 5 ]<br />echo $r</p> <p>求余数<br />r=$[ 100 % 43 ]<br />echo $r</p> <p>乘幂 (如 2 的 3 次方)<br />r=$(( 2 ** 3 ))<br />r=$[ 2 ** 3 ]<br />echo $r<br />注：expr  沒有乘幂</p> <p><strong>4：使用let 命令<br /></strong>加法：<br />n=10<br />let n=n+1<br />echo $n #n=11</p> <p>乘法：<br />let m=n*10<br />echo $m</p> <p>除法：<br />let r=m/10<br />echo $r</p> <p><br />求余数：<br />let r=m%7<br />echo $r</p> <p><br />乘冪：<br />let r=m**2<br />echo $r<br /><br />虽然Bash shell  有四种算术运算方法，但并不是每一种都是跨平台的，建议使用expr。<br />另外，我们在 script  中经常有<strong>加1操作</strong>，以下四法皆可：<br />m=$[ m + 1]<br />m=`expr $m + 1`<br />m=$(($m +  1))<br />let m=m+1</p><p>&nbsp;</p><p>转载注明出处：<a target="_blank" href="../../fwxjj/archive/2009/09/04/95342.html">http://www.cppblog.com/fwxjj/archive/2009/09/04/95342.html</a></p></div><img src ="http://www.cppblog.com/ewre/aggbug/161147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:36 <a href="http://www.cppblog.com/ewre/articles/161147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>R if else匹配</title><link>http://www.cppblog.com/ewre/articles/161146.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:35:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161146.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161146.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161146.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161146.html</trackback:ping><description><![CDATA[<div><p>不像在C里面if else根据数目和相对位置匹配，在R中，if else 靠行来匹配，例如</p><p>if(condition1) {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; statement1</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(subcondition1) {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; substatement1</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; substatement2</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>} else {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; statement2</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>这里 "} else"要放在一行，不然会出错。</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p></div><img src ="http://www.cppblog.com/ewre/aggbug/161146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:35 <a href="http://www.cppblog.com/ewre/articles/161146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bash下面grep匹配tab及相关模式的用法</title><link>http://www.cppblog.com/ewre/articles/161141.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:32:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161141.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161141.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161141.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161141.html</trackback:ping><description><![CDATA[<div>linux bash man page里面提到：<br /> <p><strong>ANSI-C Quoting</strong></p> <p>Words of the form <code>$'<var>string</var>'</code> are treated specially.    The word expands to <var>string</var>,  with backslash-escaped characters replaced    as specifed by the ANSI C  standard. Backslash escape sequences, if present,    are decoded as  follows:</p> <dl compact="compact"><dt><code>\a</code>    </dt><dd>alert (bell)    </dd><dt><code>\b</code>    </dt><dd>backspace    </dd><dt><code>\e</code>    </dt><dd>an escape character (not ANSI C)    </dd><dt><code>\f</code>    </dt><dd>form feed    </dd><dt><code>\n</code>    </dt><dd>newline    </dd><dt><code>\r</code>    </dt><dd>carriage return    </dd><dt><code>\t</code>    </dt><dd>horizontal tab    </dd><dt><code>\v</code>    </dt><dd>vertical tab    </dd><dt><code>\\</code>    </dt><dd>backslash    </dd><dt><code>\'</code>    </dt><dd>single quote    </dd><dt><code>\<var>nnn</var></code>    </dt><dd>the character whose <code>ASCII</code> code is the octal value <var>nnn</var>      (one to three digits)    </dd><dt><code>\x<var>nnn</var></code>    </dt><dd>the character whose <code>ASCII</code> code is the hexadecimal value <var>nnn</var>      (one to three digits) </dd></dl> <p>The expanded result is single-quoted, as if the dollar sign had not been present.</p> <p>也就是说如果你想在source.txt里面grep匹配tab+targetword内容，那么写法应该是：</p> <p>grep $'\t'targetword&nbsp; source.txt.</p></div><img src ="http://www.cppblog.com/ewre/aggbug/161141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:32 <a href="http://www.cppblog.com/ewre/articles/161141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>R paste</title><link>http://www.cppblog.com/ewre/articles/161124.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:22:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161124.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161124.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161124.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161124.html</trackback:ping><description><![CDATA[<div>paste函数返回一个length为1的&#8220;粘合字符串&#8221;，在R中vector的长度是个必须弄清楚的问题，不然会引起不必要的困惑</div><img src ="http://www.cppblog.com/ewre/aggbug/161124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:22 <a href="http://www.cppblog.com/ewre/articles/161124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell 逻辑运算符</title><link>http://www.cppblog.com/ewre/articles/161123.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:20:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161123.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161123.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161123.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161123.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161123.html</trackback:ping><description><![CDATA[<div><div>     </div>       <p>shell的逻辑运算符 涉及有以下几种类型，因此只要适当选择，可以解决我们很多复杂的判断，达到事半功倍效果。 </p> <p>&nbsp;</p> <p><strong>一、逻辑运算符</strong></p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <table bgcolor="#666666" cellpadding="2" cellspacing="1" width="600"> <tbody> <tr> <td bgcolor="#ffcccc" width="100"><strong>逻辑卷标 </strong></td> <td bgcolor="#cccccc" width="600"><strong>表示意思 </strong></td></tr> <tr> <td bgcolor="#ffffff">1.</td> <td bgcolor="#ffffff"><strong>关于档案与目录的侦测逻辑卷标！</strong></td></tr> <tr> <td bgcolor="#ffffff">-f </td> <td bgcolor="#ffffff">常用！侦测『档案』是否存在 eg: if [ -f filename ] </td></tr> <tr> <td bgcolor="#ffffff">-d </td> <td bgcolor="#ffffff">常用！侦测『目录』是否存在 </td></tr> <tr> <td bgcolor="#ffffff">-b </td> <td bgcolor="#ffffff">侦测是否为一个『 block 档案』 </td></tr> <tr> <td bgcolor="#ffffff">-c </td> <td bgcolor="#ffffff">侦测是否为一个『 character 档案』 </td></tr> <tr> <td bgcolor="#ffffff">-S </td> <td bgcolor="#ffffff">侦测是否为一个『 socket 标签档案』 </td></tr> <tr> <td bgcolor="#ffffff">-L </td> <td bgcolor="#ffffff">侦测是否为一个『 symbolic link 的档案』 </td></tr> <tr> <td bgcolor="#ffffff">-e </td> <td bgcolor="#ffffff">侦测『某个东西』是否存在！ </td></tr> <tr> <td bgcolor="#ffffff">2.</td> <td bgcolor="#ffffff"><strong>关于程序的逻辑卷标！</strong></td></tr> <tr> <td bgcolor="#ffffff">-G </td> <td bgcolor="#ffffff">侦测是否由 GID 所执行的程序所拥有 </td></tr> <tr> <td bgcolor="#ffffff">-O </td> <td bgcolor="#ffffff">侦测是否由 UID 所执行的程序所拥有 </td></tr> <tr> <td bgcolor="#ffffff">-p </td> <td bgcolor="#ffffff">侦测是否为程序间传送信息的 name pipe 或是 FIFO （老实说，这个不太懂！） </td></tr> <tr> <td bgcolor="#ffffff">3.</td> <td bgcolor="#ffffff"><strong>关于档案的属性侦测！</strong></td></tr> <tr> <td bgcolor="#ffffff">-r </td> <td bgcolor="#ffffff">侦测是否为可读的属性 </td></tr> <tr> <td bgcolor="#ffffff">-w </td> <td bgcolor="#ffffff">侦测是否为可以写入的属性 </td></tr> <tr> <td bgcolor="#ffffff">-x </td> <td bgcolor="#ffffff">侦测是否为可执行的属性 </td></tr> <tr> <td bgcolor="#ffffff">-s </td> <td bgcolor="#ffffff">侦测是否为『非空白档案』 </td></tr> <tr> <td bgcolor="#ffffff">-u </td> <td bgcolor="#ffffff">侦测是否具有『 SUID 』的属性 </td></tr> <tr> <td bgcolor="#ffffff">-g </td> <td bgcolor="#ffffff">侦测是否具有『 SGID 』的属性 </td></tr> <tr> <td bgcolor="#ffffff">-k </td> <td bgcolor="#ffffff">侦测是否具有『 sticky bit 』的属性 </td></tr> <tr> <td bgcolor="#ffffff">4.</td> <td bgcolor="#ffffff"><strong>两个档案之间的判断与比较 </strong>；例如[ test file1 -nt file2 ]</td></tr> <tr> <td bgcolor="#ffffff">-nt </td> <td bgcolor="#ffffff">第一个档案比第二个档案新 </td></tr> <tr> <td bgcolor="#ffffff">-ot </td> <td bgcolor="#ffffff">第一个档案比第二个档案旧 </td></tr> <tr> <td bgcolor="#ffffff">-ef </td> <td bgcolor="#ffffff">第一个档案与第二个档案为同一个档案（ link 之类的档案） </td></tr> <tr> <td bgcolor="#ffffff">5.</td> <td bgcolor="#ffffff">逻辑的『和(and)』『或(or)』</td></tr> <tr> <td bgcolor="#ffffff">&amp;&amp; </td> <td bgcolor="#ffffff">逻辑的 AND 的意思 </td></tr> <tr> <td bgcolor="#ffffff">|| </td> <td bgcolor="#ffffff">逻辑的 OR 的意思 </td></tr></tbody></table> <p>&nbsp;&nbsp; </p> <p>&nbsp;</p> <table bgcolor="#666666" border="0" cellpadding="2" cellspacing="1" width="600"> <tbody> <tr> <td bgcolor="#ffcccc" width="100">运算符号 </td> <td bgcolor="#cccccc" width="500">代表意义 </td></tr> <tr> <td bgcolor="#ffffff">= </td> <td bgcolor="#ffffff">等于 应用于：整型或字符串比较 <span style="color: #808000;">如果在[] 中，只能是字符串</span></td></tr> <tr> <td bgcolor="#ffffff">!= </td> <td bgcolor="#ffffff">不等于 应用于：整型或字符串比较 <span style="color: #808000;">如果在[] 中，只能是字符串</span></td></tr> <tr> <td bgcolor="#ffffff">&lt; </td> <td bgcolor="#ffffff">小于 应用于：整型比较 <span style="color: #808000;">在[] 中，不能使用 表示字符串</span></td></tr> <tr> <td bgcolor="#ffffff">&gt; </td> <td bgcolor="#ffffff">大于 应用于：整型比较 <span style="color: #808000;">在[] 中，不能使用 <span style="color: #808000;">表示字符串</span> </span></td></tr> <tr> <td bgcolor="#ffffff">-eq </td> <td bgcolor="#ffffff">等于 应用于：整型比较</td></tr> <tr> <td bgcolor="#ffffff">-ne </td> <td bgcolor="#ffffff">不等于 应用于：整型比较</td></tr> <tr> <td bgcolor="#ffffff">-lt </td> <td bgcolor="#ffffff">小于 应用于：整型比较</td></tr> <tr> <td bgcolor="#ffffff">-gt </td> <td bgcolor="#ffffff">大于 应用于：整型比较</td></tr> <tr> <td bgcolor="#ffffff">-le </td> <td bgcolor="#ffffff">小于或等于 应用于：整型比较</td></tr> <tr> <td bgcolor="#ffffff">-ge </td> <td bgcolor="#ffffff">大于或等于 应用于：整型比较</td></tr> <tr> <td bgcolor="#ffffff">-a </td> <td bgcolor="#ffffff">双方都成立（and） 逻辑表达式 &#8211;a 逻辑表达式</td></tr> <tr> <td bgcolor="#ffffff">-o </td> <td bgcolor="#ffffff">单方成立（or） 逻辑表达式 &#8211;o 逻辑表达式</td></tr> <tr> <td bgcolor="#ffffff">-z </td> <td bgcolor="#ffffff">空字符串 </td></tr> <tr> <td bgcolor="#ffffff">-n </td> <td bgcolor="#ffffff">非空字符串 </td></tr></tbody></table> <p>&nbsp;</p> <p><strong>二、逻辑表达式</strong></p> <p><strong></strong>&nbsp;</p> <ul><li><strong>test 命令</strong> </li></ul> <blockquote> <p><strong><span style="color: #000000;">使用方法：</span></strong>test EXPRESSION</p> <p>如：</p> <p>[root@localhost ~]# test 1 = 1 &amp;&amp; echo 'ok'<br />ok </p> <p>[root@localhost ~]# test -d /etc/ &amp;&amp; echo 'ok' <br />ok </p> <p>[root@localhost ~]# test 1 -eq 1 &amp;&amp; echo 'ok'<br />ok </p> <p>&nbsp;</p> <p>[root@localhost ~]# if test 1 = 1 ; then echo 'ok'; fi<br />ok</p></blockquote> <p>&nbsp;</p> <blockquote> <p><span style="color: #808000;"><strong>注意：所有字符 与逻辑运算符直接用&#8220;空格&#8221;分开，不能连到一起。</strong></span></p></blockquote> <p>&nbsp;</p> <ul><li><strong>精简表达式</strong> </li></ul> <blockquote> <ul><li><strong><span style="color: #000000;">[] 表达式</span></strong> </li></ul> <p>[root@localhost ~]# [ 1 -eq 1 ] &amp;&amp; echo 'ok'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />ok </p> <p><span style="color: #808000;"><span style="color: #000000;">[root@localhost ~]# [ 2 &lt; 1 ] &amp;&amp; echo 'ok'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />-bash: 2: No such file or directory<br /><br /></span></span></p> <p><span style="color: #808000;"><span style="color: #000000;">[root@localhost ~]# [ 2 \&lt; 1 ] &amp;&amp; echo 'ok'</span></span></p> <p><span style="color: #808000;"><span style="color: #000000;">[root@localhost ~]# [ 2 -gt 1 -a 3 -lt 4 ] &amp;&amp; echo 'ok'</span></span></p> <p><span style="color: #808000;"><span style="color: #000000;">ok</span></span><span style="color: #808000;">&nbsp;&nbsp;&nbsp;&nbsp; </span></p> <p>[root@localhost ~]# [ 2 -gt 1 &amp;&amp; 3 -lt 4 ] &amp;&amp; echo 'ok'&nbsp;&nbsp; <br />-bash: [: missing `]' </p><p><span style="color: #808000;">注意：在[] 表达式中，常见的&gt;,&lt;需要加转义字符，表示字符串大小比较，以acill码 位置作为比较。 不直接支持&lt;&gt;运算符，还有逻辑运算符|| &amp;&amp; 它需要用-a[and] &#8211;o[or]表示</span><span style="color: #808000;"><br /></span></p></blockquote> <p>&nbsp;</p> <blockquote> <p>&nbsp;</p> <p>&nbsp;</p> <ul><li><strong><span style="color: #000000;">[[]] 表达式</span></strong> </li></ul>[root@localhost ~]# [ 1 -eq 1 ] &amp;&amp; echo 'ok'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />ok  <p>[root@localhost ~]$ [[ 2 &lt; 3 ]] &amp;&amp; echo 'ok' <br />ok</p>[root@localhost ~]$ [[ 2 &lt; 3 &amp;&amp; 4 &gt; 5 ]] &amp;&amp; echo 'ok' <br />ok</blockquote> <blockquote> <p><span style="color: #808000;">注意：[[]] 运算符只是[]运算符的扩充。能够支持&lt;,&gt;符号运算不需要转义符，它还是以字符串比较大小。里面支持逻辑运算符：|| &amp;&amp; </span></p> <p>&nbsp;</p></blockquote> <p>&nbsp; </p> <p><strong>三、性能比较</strong> </p> <p>bash的条件表达式中有三个几乎等效的符号和命令：test，[]和[[]]。通常，大家习惯用if [];then这样的形式。而[[]]的出现，根据ABS所说，是为了兼容&gt;&lt;之类的运算符。以下是比较它们性能，发现[[]]是最快的。</p> <p><br />$ time (for m in {1..100000}; do test -d .;done;)<br />real&nbsp;&nbsp;&nbsp; 0m0.658s<br />user&nbsp;&nbsp;&nbsp; 0m0.558s<br />sys&nbsp;&nbsp;&nbsp;&nbsp; 0m0.100s</p> <p><br />$ time (for m in {1..100000}; do [ -d . ];done;)<br />real&nbsp;&nbsp;&nbsp; 0m0.609s<br />user&nbsp;&nbsp;&nbsp; 0m0.524s<br />sys&nbsp;&nbsp;&nbsp;&nbsp; 0m0.085s</p> <p><br />$ time (for m in {1..100000}; do [[ -d . ]];done;)<br />real&nbsp;&nbsp;&nbsp; 0m0.311s<br />user&nbsp;&nbsp;&nbsp; 0m0.275s<br />sys&nbsp;&nbsp;&nbsp;&nbsp; 0m0.036s</p><p>转载注明出处：<a target="_blank" href="http://www.cnblogs.com/chengmo/archive/2010/10/01/1839942.html">http://www.cnblogs.com/chengmo/archive/2010/10/01/1839942.html</a></p></div><img src ="http://www.cppblog.com/ewre/aggbug/161123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:20 <a href="http://www.cppblog.com/ewre/articles/161123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>perl 正则表达式 pattern使用变量时应该注意的问题</title><link>http://www.cppblog.com/ewre/articles/161120.html</link><dc:creator>ewre</dc:creator><author>ewre</author><pubDate>Tue, 29 Nov 2011 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/ewre/articles/161120.html</guid><wfw:comment>http://www.cppblog.com/ewre/comments/161120.html</wfw:comment><comments>http://www.cppblog.com/ewre/articles/161120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ewre/comments/commentRss/161120.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ewre/services/trackbacks/161120.html</trackback:ping><description><![CDATA[<div><p>当正则表达式中的pattern部分使用变量时，应当注意转义符的解释问题。</p><p>my $a = "MGI:87854|Ensembl:ENSMUSG00000030359";<br />my $pattern = "MGI:\d+";<br />if($a =~ /$pattern/){<br />print "$&amp;\n";<br />}</p><p>这样写本来的意图是匹配MGI:87854，但是却达不到效果，是因为逃逸符本身没有被逃逸而被perl解释器解释掉了，所以应当这样写pattern：</p><p>my $pattern = "MGI:\\d+";</p><p>注意，若将双引号换成但引号，则pattern仍可写成MGI:\d+形式，这也说明perl对引号的解释机制类似于bash，双引号的解释强度强于单引号，单引号中\不被解释称转义字符。</p><p>另外，若想匹配在正则表达式系统中有特殊含义的字符：\,|,^,$,则需要在pattern中提前加一个转义\。</p></div><img src ="http://www.cppblog.com/ewre/aggbug/161120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ewre/" target="_blank">ewre</a> 2011-11-29 15:18 <a href="http://www.cppblog.com/ewre/articles/161120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>