﻿<?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++博客-天下-随笔分类-Linux Shell</title><link>http://www.cppblog.com/aaxron/category/17909.html</link><description>记录修行的印记
</description><language>zh-cn</language><lastBuildDate>Sat, 19 Dec 2015 17:37:12 GMT</lastBuildDate><pubDate>Sat, 19 Dec 2015 17:37:12 GMT</pubDate><ttl>60</ttl><item><title>linux route命令使用</title><link>http://www.cppblog.com/aaxron/archive/2013/03/07/198261.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 07 Mar 2013 06:12:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/03/07/198261.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/198261.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/03/07/198261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/198261.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/198261.html</trackback:ping><description><![CDATA[<div>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">linux&nbsp;route命令使用<br /><br />转自</span><span style="color: #000000">:</span><span style="color: #000000">http</span><span style="color: #000000">://</span><span style="color: #000000">linux008</span><span style="color: #000000">.</span><span style="color: #000000">blog</span><span style="color: #000000">.</span><span style="color: #000000">51cto</span><span style="color: #000000">.</span><span style="color: #000000">com</span><span style="color: #000000">/</span><span style="color: #800000">2837805</span><span style="color: #000000">/</span><span style="color: #800000">550596</span><span style="color: #000000"><br /><br />说明：route命令是打印和操作ip路由表<br />描述：route操作基于内核ip路由表，它的主要作用是创建一个静态路由让指定一个主机或者一个网络通过一个网络接口，如eth0。当使用</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">add</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">或者</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">del</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">参数时，路由表被修改，如果没有参数，则显示路由表当前的内容。<br />参数说明：add</span><span style="color: #000000">:</span><span style="color: #000000">添加一条新路由。<br />&nbsp;del</span><span style="color: #000000">:</span><span style="color: #000000">删除一条路由。<br />&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">net</span><span style="color: #000000">:</span><span style="color: #000000">目标地址是一个网络。<br />&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">host</span><span style="color: #000000">:</span><span style="color: #000000">目标地址是一个主机。<br />&nbsp;netmask</span><span style="color: #000000">:</span><span style="color: #000000">当添加一个网络路由时，需要使用网络掩码。<br />&nbsp;gw</span><span style="color: #000000">:</span><span style="color: #000000">路由数据包通过网关。注意，你指定的网关必须能够达到。<br />&nbsp;metric：设置路由跳数。<br />实例：<br />&nbsp;</span><span style="color: #800000">1</span><span style="color: #000000">、route&nbsp;add&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">net&nbsp;</span><span style="color: #800000">192.168</span><span style="color: #000000">.</span><span style="color: #800000">2.0</span><span style="color: #000000">&nbsp;netmask&nbsp;</span><span style="color: #800000">255.255</span><span style="color: #000000">.</span><span style="color: #800000">255.0</span><span style="color: #000000">&nbsp;dev&nbsp;eth0<br />&nbsp;添加一条到达192</span><span style="color: #000000">.</span><span style="color: #800000">168.2</span><span style="color: #000000">.</span><span style="color: #000000">0网络的路由，指定网络掩码为255</span><span style="color: #000000">.</span><span style="color: #800000">255.255</span><span style="color: #000000">.</span><span style="color: #800000">0</span><span style="color: #000000">,</span><span style="color: #000000">数据包通过网络接口eth0。<br /><br />&nbsp;</span><span style="color: #800000">2</span><span style="color: #000000">、route&nbsp;add&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">net&nbsp;</span><span style="color: #800000">192.57</span><span style="color: #000000">.</span><span style="color: #800000">66.0</span><span style="color: #000000">&nbsp;netmask&nbsp;</span><span style="color: #800000">255.255</span><span style="color: #000000">.</span><span style="color: #800000">255.0</span><span style="color: #000000">&nbsp;gw&nbsp;</span><span style="color: #800000">192.168</span><span style="color: #000000">.</span><span style="color: #800000">2.1</span><span style="color: #000000"><br />&nbsp;添加一条到达192</span><span style="color: #000000">.</span><span style="color: #800000">57.66</span><span style="color: #000000">.</span><span style="color: #000000">0网络的路由，指定网络掩码为255</span><span style="color: #000000">.</span><span style="color: #800000">255.255</span><span style="color: #000000">.</span><span style="color: #800000">0</span><span style="color: #000000">,</span><span style="color: #000000">数据包通过网关地址192</span><span style="color: #000000">.</span><span style="color: #800000">168.2</span><span style="color: #000000">.</span><span style="color: #800000">1</span><span style="color: #000000">。<br /><br />&nbsp;</span><span style="color: #800000">3</span><span style="color: #000000">、route&nbsp;add&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">host&nbsp;</span><span style="color: #800000">192.57</span><span style="color: #000000">.</span><span style="color: #800000">66.200</span><span style="color: #000000">&nbsp;gw&nbsp;</span><span style="color: #800000">192.168</span><span style="color: #000000">.</span><span style="color: #800000">2.1</span><span style="color: #000000"><br />&nbsp;所有去往192</span><span style="color: #000000">.</span><span style="color: #800000">57.66</span><span style="color: #000000">.</span><span style="color: #000000">200主机的数据包发往网关地址192</span><span style="color: #000000">.</span><span style="color: #800000">168.2</span><span style="color: #000000">.</span><span style="color: #800000">1</span><span style="color: #000000">。<br /><br />&nbsp;</span><span style="color: #800000">4</span><span style="color: #000000">、route&nbsp;add&nbsp;default&nbsp;gw&nbsp;</span><span style="color: #800000">192.168</span><span style="color: #000000">.</span><span style="color: #800000">1.1</span><span style="color: #000000"><br />&nbsp;添加一条默认网关，所有的数据包将被转发到192</span><span style="color: #000000">.</span><span style="color: #800000">168.1</span><span style="color: #000000">.</span><span style="color: #800000">1</span><span style="color: #000000">。<br /><br />路由表内容说明：<br />查看路由&nbsp;<br /></span><span style="color: #008000">#</span><span style="color: #008000">&nbsp;route&nbsp;-n</span><span style="color: #008000"><br /></span><span style="color: #000000">Kernel&nbsp;IP&nbsp;routing&nbsp;table<br />Destination&nbsp;Gateway&nbsp;Genmask&nbsp;Flags&nbsp;Metric&nbsp;</span><span style="color: #0000ff">Ref</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">Use</span><span style="color: #000000">&nbsp;Iface<br /></span><span style="color: #800000">192.57</span><span style="color: #000000">.</span><span style="color: #800000">66.200</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">192.168</span><span style="color: #000000">.</span><span style="color: #800000">1.1</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">255.255</span><span style="color: #000000">.</span><span style="color: #800000">255.255</span><span style="color: #000000">&nbsp;UGH&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;eth0<br /></span><span style="color: #800000">192.168</span><span style="color: #000000">.</span><span style="color: #800000">1.0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">0.0</span><span style="color: #000000">.</span><span style="color: #800000">0.0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">255.255</span><span style="color: #000000">.</span><span style="color: #800000">255.0</span><span style="color: #000000">&nbsp;U&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;eth0<br /></span><span style="color: #800000">169.254</span><span style="color: #000000">.</span><span style="color: #800000">0.0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">0.0</span><span style="color: #000000">.</span><span style="color: #800000">0.0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">255.255</span><span style="color: #000000">.</span><span style="color: #800000">0.0</span><span style="color: #000000">&nbsp;U&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;eth0<br /></span><span style="color: #800000">0.0</span><span style="color: #000000">.</span><span style="color: #800000">0.0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">192.168</span><span style="color: #000000">.</span><span style="color: #800000">1.1</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">0.0</span><span style="color: #000000">.</span><span style="color: #800000">0.0</span><span style="color: #000000">&nbsp;UG&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;eth0<br />Destination：目标网络或主机。<br />Gateway：网关地址。<br />Genmask：目标网络的网络掩码。</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">255.255.255.255</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">表示一个主机。</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">0.0.0.0</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">表示网关。<br />Flags：标记。<br />U、路由被启用。<br />H、目标是一个主机<br />G、使用网关。<br /></span></div></div><img src ="http://www.cppblog.com/aaxron/aggbug/198261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-03-07 14:12 <a href="http://www.cppblog.com/aaxron/archive/2013/03/07/198261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell遍历文件夹</title><link>http://www.cppblog.com/aaxron/archive/2012/08/06/186419.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 06 Aug 2012 01:54:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/08/06/186419.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/186419.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/08/06/186419.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/186419.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/186419.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">filelist</span><span style="color: #000000">=</span><span style="color: #000000">`ls&nbsp;-A`<br /></span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;filename&nbsp;in&nbsp;</span><span style="color: #800080">$filelist</span><span style="color: #000000"><br /></span><span style="color: #0000ff">do</span><span style="color: #000000"><br />&nbsp;&nbsp;your</span><span style="color: #000000">-</span><span style="color: #000000">command&nbsp;</span><span style="color: #800080">$filename</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;${filename}</span><span style="color: #000000">.</span><span style="color: #000000">new<br />done</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/186419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-08-06 09:54 <a href="http://www.cppblog.com/aaxron/archive/2012/08/06/186419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解login shell和non-login shell</title><link>http://www.cppblog.com/aaxron/archive/2012/07/31/185719.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Tue, 31 Jul 2012 01:38:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/07/31/185719.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/185719.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/07/31/185719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/185719.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/185719.html</trackback:ping><description><![CDATA[理解login shell和non-login shell<br /><br />用户交互式login的时候，就会初始化profile相关的脚本，这就是所谓的login shell。<br /><br />当在已经存在的shell里面启动另外一个shell的时候，比如使用"bash"或者"su"，启动的这个新shell就会初始化rc相关 的脚本。这个shell就称为non-login shell。<br /><br />login shell会执行的脚本有 /etc/profile和~/.bash_profile。<br />non-login shell会执行的脚本通常有/etc/bashrc （在debian/ubuntu上是/etc/bash.bashrc）和~/.bashrc。<br /><br />在tty下login进去，得到的是一个login shell。之后使用bash或者su命令得到的是non-login shell。<br />而在debian/ubuntu下的GNOME用terminal启动出来的shell是non-login shell。退出该non-login shell的话，只需要exit即可。<br /><br />login shell 读取 /etc/profile 和 ~/.bash_profile , 并且是 先读入 profile 后读入 .bash_profile, 2个文件必读， <br />至于 bash.bashrc 和 .bashrc 则看 profile 和 .bash_profile 是否明确指定读。 <img src ="http://www.cppblog.com/aaxron/aggbug/185719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-07-31 09:38 <a href="http://www.cppblog.com/aaxron/archive/2012/07/31/185719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单Makefile的编写</title><link>http://www.cppblog.com/aaxron/archive/2011/10/12/158144.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 12 Oct 2011 09:01:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/10/12/158144.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/158144.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/10/12/158144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/158144.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/158144.html</trackback:ping><description><![CDATA[<div><div><div><span style="color: red; font-size: 18pt;">指定目标</span></div><br />all<br />这个伪目标是所有目标的目标，其功能一般是编译所有的目标。<br /><br />clean<br />这个伪目标功能是删除所有被make创建的文件。<br /><br />install<br />这个伪目标功能是安装已编译好的程序，其实就是把目标执行文件拷贝到指定的目标中去。<br /><br />print<br />这个伪目标的功能是例出改变过的源文件。<br /><br />tar<br />这个伪目标功能是把源程序打包备份。也就是一个tar文件。<br /><br />dist<br />这个伪目标功能是创建一个压缩文件，一般是把tar文件压成Z文件。或是gz文件。<br /><br />TAGS<br />这个伪目标功能是更新所有的目标，以备完整地重编译使用。<br /><br />check和test<br />这两个伪目标一般用来测试makefile的流程。</div><br /><br /><div><span style="color: red; font-size: 18pt;">自动化变量</span></div><br />$@<br />表示规则中的目标文件集。在模式规则中，如果有多个目标，那么，$@就是匹配于目标中模式定义的集合。<br /><br />$^<br />所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的，那个这个变量会去除重复的依赖目标，只保留一份。<br /><div><br />$?<br />所有比目标新的依赖目标的集合。以空格分隔。</div><br />$+<br />这个变量很像$^，也是所有依赖目标的集合。只是它不去除重复的依赖目标。<br /><br />$%<br />当规划的目标文件是库文件时，$%表示规则中的目标成员名。<br />例如，如果一个目标是foo.a(bar.o)，那么，$%就是bar.o，$@就是foo.a。<br />如果目标不是函数库文件（Unix下是[.a]，Windows下是[.lib]），那么其值为空。<br /><br />$&lt;<br />依赖目标中的第一个目标名字。如果依赖目标是以模式（即%）定义的，那么$&lt;将是符合模式的一系列的文件集。注意，其是一个一个取出来的。<br /></div><br /><br /><div><span style="color: red; font-size: 18pt;">例子:</span></div><br /><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; ">CCLD&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;g</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Wall&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">g&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">o<br />CC&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;g</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Wall&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">c&nbsp;<br />OBJS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SocketServer</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o<br />TARGETS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">0928</span><span style="color: #000000; "><br /><br /></span><span style="color: #000000; ">.</span><span style="color: #000000; ">PHONY</span><span style="color: #000000; ">:</span><span style="color: #000000; ">all<br />all</span><span style="color: #000000; ">:</span><span style="color: #000000; ">$(TARGETS)<br /><br /><br />SocketServer</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o</span><span style="color: #000000; ">:</span><span style="color: #000000; ">SocketServer</span><span style="color: #000000; ">.</span><span style="color: #000000; ">cpp<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;$</span><span style="color: #000000; ">^</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #800000; ">0928</span><span style="color: #000000; ">:</span><span style="color: #000000; ">$(OBJS)&nbsp;main</span><span style="color: #000000; ">.</span><span style="color: #000000; ">cpp<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CCLD)&nbsp;$@&nbsp;$</span><span style="color: #000000; ">^</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">@echo</span><span style="color: #000000; ">&nbsp;make&nbsp;success<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #000000; ">.</span><span style="color: #000000; ">PHONY</span><span style="color: #000000; ">:</span><span style="color: #000000; ">clean<br />clean</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">rm&nbsp;-rf&nbsp;${OBJS}</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rf&nbsp;</span><span style="color: #000000; ">*.</span><span style="color: #000000; ">o<br />&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rf&nbsp;$(TARGETS)<br /><br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/158144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-10-12 17:01 <a href="http://www.cppblog.com/aaxron/archive/2011/10/12/158144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell脚本中一些特殊符号</title><link>http://www.cppblog.com/aaxron/archive/2011/09/08/155359.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 08 Sep 2011 08:02:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/09/08/155359.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/155359.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/09/08/155359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/155359.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/155359.html</trackback:ping><description><![CDATA[<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; ">shell脚本中一些特殊符号<br /><br /></span><span style="color: #800000; ">1</span><span style="color: #000000; ">、{}&nbsp;大括号：<br />用法一：通配符扩展<br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;ls&nbsp;my_{finger</span><span style="color: #000000; ">,</span><span style="color: #000000; ">toe}s<br />这条命令相当于如下命令的组合：<br />&nbsp;&nbsp;&nbsp;&nbsp;ls&nbsp;my_fingers&nbsp;my_toes<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">mkdir</span><span style="color: #000000; ">&nbsp;{userA</span><span style="color: #000000; ">,</span><span style="color: #000000; ">userB</span><span style="color: #000000; ">,</span><span style="color: #000000; ">userC}</span><span style="color: #000000; ">-</span><span style="color: #000000; ">{home</span><span style="color: #000000; ">,</span><span style="color: #000000; ">bin</span><span style="color: #000000; ">,</span><span style="color: #000000; ">data}<br /><br />我们将得到&nbsp;userA</span><span style="color: #000000; ">-</span><span style="color: #000000; ">home</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;userA</span><span style="color: #000000; ">-</span><span style="color: #000000; ">bin</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;userA</span><span style="color: #000000; ">-</span><span style="color: #000000; ">data</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;userB</span><span style="color: #000000; ">-</span><span style="color: #000000; ">home</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;userB</span><span style="color: #000000; ">-</span><span style="color: #000000; ">bin</span><span style="color: #000000; ">,</span><span style="color: #000000; ">userB</span><span style="color: #000000; ">-</span><span style="color: #000000; ">data</span><span style="color: #000000; ">,</span><span style="color: #000000; ">userC</span><span style="color: #000000; ">-</span><span style="color: #000000; ">home</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;userC</span><span style="color: #000000; ">-</span><span style="color: #000000; ">bin</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;userC</span><span style="color: #000000; ">-</span><span style="color: #000000; ">data，这几个目录<br />用法二：可用于语句块的构造，语句之间用回车隔开。如果你想在某些使用单个语句的地方（比如在AND或OR列表中）使用多条语句，你可以把它们括在花括号{}中来构造一个语句块。<br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">grep</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">v&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">$cdcatnum</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$strack_file</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$temp_file</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;cat&nbsp;</span><span style="color: #800080; ">$temp_file</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$strack_file</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;echo<br />&nbsp;&nbsp;&nbsp;&nbsp;cat&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">n&nbsp;file1<br /><br /><br />(注：以上大括号中的四句命令够成了一个语句块)<br />用法三：参数扩展<br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;${name</span><span style="color: #000000; ">:-</span><span style="color: #000000; ">default}&nbsp;使用一个默认值（一般是空值）来代替那些空的或者没有赋值的变量name；<br />&nbsp;&nbsp;&nbsp;&nbsp;${name</span><span style="color: #000000; ">:=</span><span style="color: #000000; ">default}使用指定值来代替空的或者没有赋值的变量name；<br />&nbsp;&nbsp;&nbsp;&nbsp;${name</span><span style="color: #000000; ">:?</span><span style="color: #000000; ">message}如果变量为空或者未赋值，那么就会显示出错误信息并中止脚本的执行同时返回退出码1。<br />&nbsp;&nbsp;&nbsp;&nbsp;${</span><span style="color: #008000; ">#</span><span style="color: #008000; ">name}&nbsp;给出name的长度</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;${name</span><span style="color: #800080; ">%word</span><span style="color: #000000; ">}&nbsp;从name的尾部开始删除与word匹配的最小部分，然后返回剩余部分<br />&nbsp;&nbsp;&nbsp;&nbsp;${name</span><span style="color: #000000; ">%</span><span style="color: #800080; ">%word</span><span style="color: #000000; ">}&nbsp;从name的尾部开始删除与word匹配的最长部分，然后返回剩余部分<br />&nbsp;&nbsp;&nbsp;&nbsp;${name</span><span style="color: #008000; ">#</span><span style="color: #008000; ">word}&nbsp;从name的头部开始删除与word匹配的最小部分，然后返回剩余部分</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;${name</span><span style="color: #008000; ">#</span><span style="color: #008000; ">#word}&nbsp;从name的头部开始删除与word匹配的最长部分，然后返回剩余部分</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br /><br />（注，name为变量名，word为要匹配的字符串）<br />用法三在处理字符串和未知变量时，是很有用的。<br /><br /></span><span style="color: #800000; ">2</span><span style="color: #000000; ">、[]&nbsp;中括号：<br />用法一：通配符扩展：<br />允许匹配方括号中任何一个单个字符<br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;ls&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">[eh][to][cm]</span><span style="color: #000000; ">*</span><span style="color: #000000; "><br /><br /><br />相当于执行&nbsp;ls&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">etc&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">home（若有</span><span style="color: #000000; ">/</span><span style="color: #000000; ">eom目录，就相当于会执行ls&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">etc&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">home&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">eom）<br />注：在mkdir命令下不能扩展<br />用法二：用于条件判断符号：<br />[]符号可理解为指向test命令的一个软链接，所以其用法可完全参照test，将test位置替换为[便可。<br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;[&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">$?</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">0</span><span style="color: #000000; ">&nbsp;]&nbsp;等价于&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;test&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">$?</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">0</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">Executes&nbsp;error</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br /><br /><br /><br /></span><span style="color: #800000; ">3</span><span style="color: #000000; ">、`command`&nbsp;反引号：<br />`command`与$(command)的含义相同，都是返回当前执行命令的结果<br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br /></span><span style="color: #008000; ">#</span><span style="color: #008000; ">!/bin/sh</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;file&nbsp;in&nbsp;$(ls&nbsp;f</span><span style="color: #000000; ">*.</span><span style="color: #000000; ">sh);</span><span style="color: #0000FF; ">do</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;lpr&nbsp;</span><span style="color: #800080; ">$file</span><span style="color: #000000; "><br />done<br /></span><span style="color: #0000FF; ">exit</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">0</span><span style="color: #000000; "><br /><br /><br />该例实现了扩展f</span><span style="color: #000000; ">*.</span><span style="color: #000000; ">sh给出所有匹配模式的文件的名字。<br /><br /></span><span style="color: #800000; ">4</span><span style="color: #000000; ">、</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; ">string</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; ">&nbsp;单引号&nbsp;和&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">string</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">&nbsp;双引号<br />双引号：如果想在定义的变量中加入空格，就必须使用单引号或双引号，<br />单、双引号的区别在于双引号转义特殊字符而单引号不转义特殊字符<br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;heyyou</span><span style="color: #000000; ">=</span><span style="color: #000000; ">home<br />&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; ">$heyyou</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;</span><span style="color: #800080; ">$heyyou</span><span style="color: #000000; ">&nbsp;（</span><span style="color: #800080; ">$没有转义</span><span style="color: #000000; ">）<br />&nbsp;&nbsp;&nbsp;&nbsp;eg</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;$&nbsp;heyyou</span><span style="color: #000000; ">=</span><span style="color: #000000; ">home<br />&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">$heyyou</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;home&nbsp;（很明显，</span><span style="color: #800080; ">$转义了输出了heyyou变量的值</span><span style="color: #000000; ">）<br /><br /><br /><br /></span><span style="color: #800000; ">5</span><span style="color: #000000; ">、$</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;它的作用是告诉你引用变量的总数量是多少；</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;$$&nbsp;它的作用是告诉你shell脚本的进程号；<br />&nbsp;&nbsp;&nbsp;&nbsp;$</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;以一个单字符串显示所有的脚本传递的参数。等价于$</span><span style="color: #800000; ">1</span><span style="color: #000000; ">&nbsp;$</span><span style="color: #800000; ">2</span><span style="color: #000000; ">&nbsp;$</span><span style="color: #800000; ">3</span><span style="color: #000000; "><img src="http://www.cppblog.com/Images/dot.gif" alt="" /><img src="http://www.cppblog.com/Images/dot.gif" alt="" />.</span><span style="color: #000000; ">；<br />&nbsp;&nbsp;&nbsp;&nbsp;$@&nbsp;与$</span><span style="color: #000000; ">*</span><span style="color: #000000; ">基本类似（参见序号7），但在数组赋值时有些不同；<br />&nbsp;&nbsp;&nbsp;&nbsp;$</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;前一个命令的退出码；<br />&nbsp;&nbsp;&nbsp;&nbsp;$</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;显示shell使用的当前选项；<br />&nbsp;&nbsp;&nbsp;&nbsp;$</span><span style="color: #000000; ">!</span><span style="color: #000000; ">&nbsp;最后一个后台运行的进程ID号。<br /><br /><br /><br /></span><span style="color: #800000; ">6</span><span style="color: #000000; ">、$((</span><span style="color: #000000; "><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span style="color: #000000; ">))语法：对括号内的表达式求值<br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">!/bin/sh</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="color: #000000; ">=</span><span style="color: #800000; ">0</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;hile&nbsp;[&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">$x</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">ne&nbsp;</span><span style="color: #800000; ">10</span><span style="color: #000000; ">&nbsp;];</span><span style="color: #0000FF; ">do</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #800080; ">$x</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="color: #000000; ">=</span><span style="color: #000000; ">$((</span><span style="color: #800080; ">$x</span><span style="color: #000000; ">+</span><span style="color: #800000; ">1</span><span style="color: #000000; ">))<br />&nbsp;&nbsp;&nbsp;&nbsp;done<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">exit</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">0</span><span style="color: #000000; "><br /><br /><br /><br /></span><span style="color: #800000; ">7</span><span style="color: #000000; ">、shell中几种特殊的参数变量的引用<br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;$</span><span style="color: #800000; ">1</span><span style="color: #000000; ">、$</span><span style="color: #800000; ">2</span><span style="color: #000000; ">、$</span><span style="color: #800000; ">3</span><span style="color: #000000; ">&#8230;&#8230;${</span><span style="color: #800000; ">10</span><span style="color: #000000; ">}、${</span><span style="color: #800000; ">11</span><span style="color: #000000; ">}、${</span><span style="color: #800000; ">12</span><span style="color: #000000; ">}&#8230;&#8230;&nbsp;：表示脚本传入的的各个参数，注意当需表示两位数以后的参数时数字要用花括号括起。<br />&nbsp;&nbsp;&nbsp;&nbsp;$@&nbsp;列出所有的参数，各参数用空格隔开<br />&nbsp;&nbsp;&nbsp;&nbsp;$</span><span style="color: #000000; ">*:</span><span style="color: #000000; ">&nbsp;列出所有的参数，各参数用环境变量IFS的第一个字符隔开<br /><br /><br /><br /></span><span style="color: #800000; ">8</span><span style="color: #000000; ">、命令列表：<br />AND列表&nbsp;statement1&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;statement2&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;statement3&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;&#8230;</span><span style="color: #000000; ">:</span><span style="color: #000000; ">只有在前面所有的命令都执行成功的情况下才执行后一条命令<br />OR列表&nbsp;statement1&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;statement2&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;statement3&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;&#8230;</span><span style="color: #000000; ">:</span><span style="color: #000000; ">允许执行一系列命令直到有一条命令成功为止，其后所有命令将不再被执行<br /></span><span style="color: #008000; ">#</span><span style="color: #008000; ">!/bin/sh</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;touch&nbsp;file_one<br />&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;file_two<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;[&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;file_one&nbsp;]&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">hello</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;[&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">f&nbsp;file_two&nbsp;]&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">&nbsp;there</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">in&nbsp;if</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">in&nbsp;else</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;fi<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">exit</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">0</span><span style="color: #000000; "><br /><br /><br />上例的输出为：<br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;hello<br />&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /><br /><br />关于AND列表与OR列表，在逻辑判断中很使用，下面就举一个其最常用的例子：<br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;condition&nbsp;]&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;command&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;true&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;command&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;false</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br /><br /><br />当条件为真时，执行commandfor&nbsp;true&nbsp;</span><span style="color: #000000; ">,</span><span style="color: #000000; ">当条件为假时，执行command&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;false<br /><br /></span><span style="color: #800000; ">9</span><span style="color: #000000; ">、</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;冒号：内建空指令，返回值为0<br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />$&nbsp;</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />$&nbsp;echo&nbsp;$</span><span style="color: #000000; ">?</span><span style="color: #000000; "><br />$&nbsp;</span><span style="color: #800000; ">0</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;(该语句结构可实现一个无限循环)<br /><br /><br /><br /></span><span style="color: #800000; ">10</span><span style="color: #000000; ">、;&nbsp;分号</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;在&nbsp;shell&nbsp;中，担任</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">连续指令</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">功能的符号就是</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">分号</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br /><br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;cd&nbsp;</span><span style="color: #000000; ">~/</span><span style="color: #000000; ">backup&nbsp;;&nbsp;</span><span style="color: #0000FF; ">mkdir</span><span style="color: #000000; ">&nbsp;startup&nbsp;;&nbsp;cp&nbsp;</span><span style="color: #000000; ">~/.*</span><span style="color: #000000; ">&nbsp;startup</span><span style="color: #000000; ">/.</span><span style="color: #000000; "><br /><br /></span><span style="color: #800000; ">11</span><span style="color: #000000; ">、</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;井号：表示符号后面的是注解文字，不会被执行；</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;匹配文件名中的任何字符，包括字符串；<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;匹配文件名中的任何单个字符。<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">&nbsp;代表使用者的&nbsp;home&nbsp;目录<br /><br /></span><span style="color: #800000; ">12</span><span style="color: #000000; ">、</span><span style="color: #000000; ">\</span><span style="color: #000000; ">&nbsp;反斜线：<br />放在指令前，有取消&nbsp;aliases（别名）&nbsp;的作用；<br />放在特殊符号前，则该特殊符号的作用消失；<br />放在指令的最末端，表示指令连接下一行（使得回车符无效，只起换行作用）<br /><br /></span><span style="color: #800000; ">13</span><span style="color: #000000; ">、</span><span style="color: #000000; ">!</span><span style="color: #000000; ">&nbsp;感叹号：<br />通常它代表反逻辑的作用，譬如条件侦测中，用&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;来代表</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">不等于</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br /><br /></span><span style="color: #800000; ">14</span><span style="color: #000000; ">、</span><span style="color: #000000; ">**</span><span style="color: #000000; ">&nbsp;次方运算：两个星号在运算时代表&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">次方</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">&nbsp;的意思<br />代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">sus=2**3</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">sus&nbsp;=&nbsp;$sus</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;sus&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">8</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/155359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-09-08 16:02 <a href="http://www.cppblog.com/aaxron/archive/2011/09/08/155359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell编程笔记</title><link>http://www.cppblog.com/aaxron/archive/2011/09/08/155357.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 08 Sep 2011 07:54:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/09/08/155357.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/155357.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/09/08/155357.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/155357.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/155357.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">脚本不是复杂的程序</span><span style="color: #000000">,</span><span style="color: #000000">它是按行解释的</span><span style="color: #000000">,</span><span style="color: #000000">脚本的第一行总是以</span><span style="color: #008000">#</span><span style="color: #008000">!/bin/sh开始.<br /></span><span>这行代码通知书shell使用系统上的Bourne&nbsp;shell解析器.</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />shell语法<br />test&nbsp;命令<br /></span><span style="color: #800000">1</span><span style="color: #000000">.</span><span style="color: #000000">条件测试<br />test命令用于测试字符串</span><span style="color: #000000">,</span><span style="color: #000000">文件状态和数字</span><span style="color: #000000">.</span><span style="color: #000000"><br /><br />工作原理<br />test&nbsp;命令最短的定义可能是评估一个表达式；如果条件为真，则返回一个&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;值。如果表达式不为真，返回非0<br /><br />test一般有两种格式</span><span style="color: #000000">:</span><span style="color: #000000"><br /><br />test&nbsp;条件表达式<br />或<br />[&nbsp;条件表达式&nbsp;]<br /><br />使用方括号时</span><span style="color: #000000">,</span><span style="color: #000000">要注意在条件两边加上空格</span><span style="color: #000000">.</span><span style="color: #000000"><br /><br />文件运算符<br />利用这些运算符，您可以在程序中根据对文件类型的评估结果执行不同的操作：<br /></span><span style="color: #000000">-</span><span style="color: #000000">b&nbsp;file&nbsp;如果文件为一个块特殊文件，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">c&nbsp;file&nbsp;如果文件为一个字符特殊文件，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">d&nbsp;file&nbsp;如果文件为一个目录，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">e&nbsp;file&nbsp;如果文件存在，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">f&nbsp;file&nbsp;如果文件为一个普通文件，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">g&nbsp;file&nbsp;如果设置了文件的&nbsp;SGID&nbsp;位，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">G&nbsp;file&nbsp;如果文件存在且归该组所有，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">k&nbsp;file&nbsp;如果设置了文件的粘着位，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">O&nbsp;file&nbsp;如果文件存在并且归该用户所有，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">p&nbsp;file&nbsp;如果文件为一个命名管道，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">r&nbsp;file&nbsp;如果文件可读，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">s&nbsp;file&nbsp;如果文件的长度不为零，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">S&nbsp;file&nbsp;如果文件为一个套接字特殊文件，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">t&nbsp;fd&nbsp;&nbsp;&nbsp;&nbsp;如果&nbsp;fd&nbsp;是一个与终端相连的打开的文件描述符（fd&nbsp;默认为&nbsp;</span><span style="color: #800000">1</span><span style="color: #000000">），则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">u&nbsp;file&nbsp;如果设置了文件的&nbsp;SUID&nbsp;位，则为真<br /></span><span style="color: #000000">-</span><span style="color: #000000">w&nbsp;file&nbsp;如果文件可写，则为真<br /></span><span style="color: #0000ff">-x</span><span style="color: #000000">&nbsp;file&nbsp;如果文件可执行，则为真<br /><br />字符串比较运算符<br />如标题所示，这组函数比较字符串的值。您可以检查它们是否存在、是否相同或者是否不同。<br />string&nbsp;测试以判断字符串是否不为空<br /></span><span style="color: #000000">-</span><span style="color: #000000">n&nbsp;string&nbsp;测试以判断字符串是否不为空；<br /></span><span style="color: #000000">-</span><span style="color: #000000">z&nbsp;string&nbsp;测试以判断字符串是否为空；<br />string1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;string2&nbsp;测试以判断&nbsp;string1&nbsp;是否与&nbsp;string2&nbsp;相同<br />string1&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;string2&nbsp;测试以判断&nbsp;string1&nbsp;是否与&nbsp;string2&nbsp;不同<br /><br />整数比较运算符<br />正如字符串比较运算符验证字符串相等或不同一样，整数比较运算符对数字执行相同的功能。<br />如果变量的值匹配则表达式测试为真，如果不匹配，则为假。整数比较运算符不处理字符串（正如字符串运算符不处理数字一样）：<br /></span><span style="color: #000000">-</span><span style="color: #000000">eq&nbsp;&nbsp;&nbsp;&nbsp;等于<br /></span><span style="color: #000000">-</span><span style="color: #000000">ge&nbsp;&nbsp;&nbsp;&nbsp;大于或等于<br /></span><span style="color: #000000">-</span><span style="color: #000000">gt&nbsp;&nbsp;&nbsp;&nbsp;大于<br /></span><span style="color: #000000">-</span><span style="color: #000000">le&nbsp;&nbsp;&nbsp;&nbsp;小于或等于<br /></span><span style="color: #000000">-</span><span style="color: #000000">lt&nbsp;&nbsp;&nbsp;&nbsp;小于<br /></span><span style="color: #000000">-</span><span style="color: #000000">ne&nbsp;&nbsp;&nbsp;&nbsp;不等于<br />如</span><span style="color: #000000">:</span><span style="color: #000000"><br /></span><span style="color: #008000">#</span><span style="color: #008000">&nbsp;[&nbsp;2&nbsp;-gt&nbsp;3&nbsp;]<br />#&nbsp;echo&nbsp;$?</span><span style="color: #008000"><br /></span><span style="color: #800000">1</span><span style="color: #000000"><br /><br /></span><span style="color: #008000">#</span><span style="color: #008000">&nbsp;[&nbsp;2&nbsp;-lt&nbsp;3&nbsp;]<br />#&nbsp;echo&nbsp;$?</span><span style="color: #008000"><br /></span><span style="color: #800000">0</span><span style="color: #000000"><br /><br />布尔运算符<br />布尔运算符在几乎每种语言中的工作方式都相同&nbsp;&#8212;&nbsp;包括&nbsp;shell&nbsp;脚本。在&nbsp;nutshell&nbsp;中，它们检查多个条件为真或为假，或者针对假的条件而不是真的条件采取操作。与&nbsp;test&nbsp;搭配使用的运算符有</span><span style="color: #000000">:</span><span style="color: #000000"><br /></span><span style="color: #000000">!</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;条件非<br /></span><span style="color: #000000">-</span><span style="color: #000000">a&nbsp;&nbsp;&nbsp;&nbsp;条件与<br /></span><span style="color: #000000">-</span><span style="color: #000000">o&nbsp;&nbsp;&nbsp;&nbsp;条件或<br /><br /><br /><br />控制结构<br />无论什么编程语言都离不开条件判断。SHELL也不例外。<br />条件分支<br /><br />if语句<br /><br />语法1</span><span style="color: #000000">:</span><span style="color: #000000"><br /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;条件表达式<br />&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;&nbsp;&nbsp;&nbsp;命令<br />fi<br /><br />语法2</span><span style="color: #000000">:</span><span style="color: #000000"><br /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;条件表达式;&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">&nbsp;something&nbsp;here<br />elif&nbsp;条件表达式&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">&nbsp;another&nbsp;thing&nbsp;here<br /></span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">&nbsp;something&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;here<br />fi<br /><br />使用if时</span><span style="color: #000000">,</span><span style="color: #000000">必须将then部分放在新行</span><span style="color: #000000">,</span><span style="color: #000000">否则会报错</span><span style="color: #000000">.</span><span style="color: #000000"><br />如果要不分行</span><span style="color: #000000">,</span><span style="color: #000000">必须使用命令分隔符</span><span style="color: #000000">.<br /></span>
<div><span style="font-size: 12px">$ vi testsh.sh</span></div>
<div><span style="font-size: 12px">#!/bin/sh</span></div>
<div><span style="font-size: 12px">if</span></div>
<div><span style="font-size: 12px">cat 111-tmp.txt | grep ting1</span></div>
<div><span style="font-size: 12px">then</span></div>
<div><span style="font-size: 12px">echo found</span></div>
<div><span style="font-size: 12px">else</span></div>
<div><span style="font-size: 12px">echo "no found"</span></div>
<div><span style="font-size: 12px">fi</span></div>
<div><span style="font-size: 12px"><br /></span></div>
<div><span style="font-size: 12px">$ vi testsh.sh</span></div>
<div><span style="font-size: 12px">#!/bin/sh</span></div>
<div><span style="font-size: 12px">cat 111-tmp.txt | grep ting1</span></div>
<div><span style="font-size: 12px">if [ $? -eq 0 ]</span></div>
<div><span style="font-size: 12px">then</span></div>
<div><span style="font-size: 12px">echo $?</span></div>
<div><span style="font-size: 12px">echo found</span></div>
<div><span style="font-size: 12px">else</span></div>
<div><span style="font-size: 12px">echo $?</span></div>
<div><span style="font-size: 12px">echo "no found"</span></div>
<div><span style="font-size: 12px">fi</span></div><span style="color: #000000"><br />
<p><font color="#000000" face="Verdana">#!/bin/sh</font></p>
<p><font color="#000000" face="Verdana">#函数<br />gw()<br />{<br />echo "do function gw()"<br />return 0<br />}</font></p>
<p><font color="#000000" face="Verdana">if gw<br />then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "run succeed"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "run succeed"<br />else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "run failed"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "run failed"<br />fi</font></p>
<p><font color="#000000" face="Verdana">说明：<br />if 命令/函数 0为真，走then<br />if 多条指令,这些命令之间相当于&#8220;and&#8221;（与）<br /></font></p><br /><br />case语句<br />case命令可类比C语言的switch</span><span style="color: #000000">/</span><span style="color: #000000">case语句，esac表示case语句块的结束。<br />每个匹配分支可以有若干条命令，末尾必须以;;结束，执行时找到第一个匹配的分支并执行相应的命令，然后直接跳到esac之后，不需要像C语言一样用break跳出。<br />如</span><span style="color: #000000">:</span><span style="color: #000000"><br /></span><span style="color: #008000">#</span><span style="color: #008000">!&nbsp;/bin/sh</span><span style="color: #008000"><br /></span><span style="color: #000000">echo&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">Is&nbsp;it&nbsp;morning?&nbsp;Please&nbsp;answer&nbsp;yes&nbsp;or&nbsp;no.</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000"><br /></span><span style="color: #0000ff">read</span><span style="color: #000000">&nbsp;YES_OR_NO<br />case&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">$YES_OR_NO</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">&nbsp;in<br />yes</span><span style="color: #000000">|</span><span style="color: #000000">y</span><span style="color: #000000">|</span><span style="color: #000000">Yes</span><span style="color: #000000">|</span><span style="color: #000000">YES)<br />&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">Good&nbsp;Morning!</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">;;<br />[nN]</span><span style="color: #000000">*</span><span style="color: #000000">)<br />&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">Good&nbsp;Afternoon!</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">;;<br /></span><span style="color: #000000">*</span><span style="color: #000000">)<br />&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">Sorry,&nbsp;$YES_OR_NO&nbsp;not&nbsp;recognized.&nbsp;Enter&nbsp;yes&nbsp;or&nbsp;no.</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000"><br />&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">1</span><span style="color: #000000">;;<br />esac<br /></span><span style="color: #0000ff">exit</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">0</span><span style="color: #000000"><br /><br /><br />for语句<br /></span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;变量名&nbsp;in&nbsp;列表<br /></span><span style="color: #0000ff">do</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;命令1<br />&nbsp;&nbsp;&nbsp;&nbsp;命令2<br />done<br /><br />Shell脚本的for循环结构和C语言很不一样，它类似php编程语言的foreach循环。例如：<br /></span><span style="color: #008000">#</span><span style="color: #008000">!/bin/sh</span><span style="color: #008000"><br /></span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;FRUIT&nbsp;in&nbsp;apple&nbsp;banana&nbsp;pear;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">I&nbsp;like&nbsp;$FRUIT</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000"><br />done<br /><br /></span><span style="color: #0000ff">while</span><span style="color: #000000">/</span><span style="color: #0000ff">do</span><span style="color: #000000">/</span><span style="color: #000000">done<br />while的用法和C语言类似。比如一个验证密码的脚本：<br /><br /></span><span style="color: #008000">#</span><span style="color: #008000">!/bin/sh</span><span style="color: #008000"><br /></span><span style="color: #000000">echo&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">Enter&nbsp;password:</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000"><br /></span><span style="color: #0000ff">read</span><span style="color: #000000">&nbsp;TRY<br /></span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">$TRY</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">secret</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">Sorry,&nbsp;try&nbsp;again</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000"><br />&nbsp;&nbsp;</span><span style="color: #0000ff">read</span><span style="color: #000000">&nbsp;TRY<br />done<br /><br /><br />位置参数和特殊变量<br />$</span><span style="color: #800000">0</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;相当于C语言main函数的argv[</span><span style="color: #800000">0</span><span style="color: #000000">]<br />$</span><span style="color: #800000">1</span><span style="color: #000000">、$</span><span style="color: #800000">2</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;这些称为位置参数（Positional&nbsp;Parameter），相当于C语言main函数的argv[</span><span style="color: #800000">1</span><span style="color: #000000">]、argv[</span><span style="color: #800000">2</span><span style="color: #000000">]</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span style="color: #000000"><br />$</span><span style="color: #008000">#</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;参数个数,不包括程序自身,相当于C语言main函数的argc-1</span><span style="color: #008000"><br /></span><span style="color: #000000">$@&nbsp;&nbsp;&nbsp;&nbsp;表示参数列表</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">$1</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">$2</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span style="color: #000000">，例如可以用在for循环中的in后面。<br />$</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;上一条命令的Exit&nbsp;Status<br />$$&nbsp;&nbsp;&nbsp;&nbsp;当前Shell的进程号<br /><br />位置参数可以用shift命令左移。<br />比如shift&nbsp;3表示原来的$4现在变成$</span><span style="color: #800000">1</span><span style="color: #000000">，原来的$5现在变成$2等等，原来的$</span><span style="color: #800000">1</span><span style="color: #000000">、$</span><span style="color: #800000">2</span><span style="color: #000000">、$3丢弃，$0不移动。不带参数的shift命令相当于shift&nbsp;</span><span style="color: #800000">1</span><span style="color: #000000">。<br /><br /><br />函数<br /><br />和C语言类似，Shell中也有函数的概念，但是函数定义中没有返回值也没有参数列表。例如：<br /><br /></span><span style="color: #008000">#</span><span style="color: #008000">!/bin/sh</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />foo(){&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">Function&nbsp;foo&nbsp;is&nbsp;called</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">;}<br />echo&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">-=start=-</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000"><br />foo<br />echo&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">-=end=-</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000"><br /><br />注意函数体的左花括号{和后面的命令之间必须有空格或换行，如果将最后一条命令和右花括号}写在同一行，命令末尾必须有;号。<br /><br />在定义foo()函数时并不执行函数体中的命令，就像定义变量一样，只是给foo这个名字一个定义，到后面调用foo函数的时候（注意Shell中的函数调用不写括号）才执行函数体中的命令。Shell脚本中的函数必须先定义后调用，一般把函数定义都写在脚本的前面，把函数调用和其它命令写在脚本的最后（类似C语言中的main函数，这才是整个脚本实际开始执行命令的地方）。<br /><br />Shell函数没有参数列表并不表示不能传参数，事实上，函数就像是迷你脚本，调用函数时可以传任意个参数，在函数内同样是用$</span><span style="color: #800000">0</span><span style="color: #000000">、$</span><span style="color: #800000">1</span><span style="color: #000000">、$2等变量来提取参数，函数中的位置参数相当于函数的局部变量，改变这些变量并不会影响函数外面的$</span><span style="color: #800000">0</span><span style="color: #000000">、$</span><span style="color: #800000">1</span><span style="color: #000000">、$2等变量。函数中可以用return命令返回，如果return后面跟一个数字则表示函数的Exit&nbsp;Status。<br /><br />until语句<br />&nbsp;&nbsp;until循环执行一系列命令直至条件为真时停止。注意</span><span style="color: #000000">,</span><span style="color: #000000">这里是直到条件是真时才停止<br />until格式为：<br /></span><span style="color: #0000ff">until</span><span style="color: #000000">&nbsp;条件<br />&nbsp;&nbsp;命令1<br />&nbsp;&nbsp;</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span style="color: #000000"><br />done<br /><br /><br />i</span><span style="color: #000000">=</span><span style="color: #800000">0</span><span style="color: #000000"><br /></span><span style="color: #0000ff">until</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #800080">$i</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">gt&nbsp;</span><span style="color: #800000">3</span><span style="color: #000000">&nbsp;]<br /></span><span style="color: #0000ff">do</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">`expr&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000; font-weight: bold">$i</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">1</span><span style="color: #000000">`<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">#</span><span style="color: #008000">i=$(($i&nbsp;+&nbsp;1))</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #800080">$i</span><span style="color: #000000"><br />done</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/155357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-09-08 15:54 <a href="http://www.cppblog.com/aaxron/archive/2011/09/08/155357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>