<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PATH &#8211; bhzhuOS爱好者(原StartOS爱好者)</title>
	<atom:link href="https://www.bhzhu203.com/tag/path/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bhzhu203.com</link>
	<description>QQ群号125732839</description>
	<lastBuildDate>Sun, 11 Sep 2016 17:05:41 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>
	<item>
		<title>Linux kernel headers files 生成步骤</title>
		<link>https://www.bhzhu203.com/2016/09/12/linux-kernel-headers-files-%e7%94%9f%e6%88%90%e6%ad%a5%e9%aa%a4/</link>
		
		<dc:creator><![CDATA[bhzhu203]]></dc:creator>
		<pubDate>Sun, 11 Sep 2016 17:04:59 +0000</pubDate>
				<category><![CDATA[linux知识]]></category>
		<category><![CDATA[headers]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[PATH]]></category>
		<guid isPermaLink="false">http://www.bhzhu203.com/?p=361</guid>

					<description><![CDATA[Linux kernel headers file 是用于编译内核驱动使用的。  [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Linux kernel headers file 是用于编译内核驱动使用的。</p>
<p>编译好kernel之后 复制好相应的文件，make  clean 清理，之后就是要去生成轻量的headers file了。如果不去精简它，它足足有500M，非常占地方。</p>
<p>cd dir</p>
<p>#清理.c后缀的文件</p>
<p>find -name *.c -exec rm -f {} \;</p>
<p>#删除多余的文档</p>
<p>rm -rf Documentation</p>
<p>#排除若干个目录，然后删除 .txt   .h结尾的文件</p>
<p>find .  \( -path &#8220;./net/mac80211&#8221; -o -path &#8220;./drivers/media&#8221; -o -path &#8220;./drivers/md&#8221; -o -path &#8220;./scripts&#8221;  -o -path &#8220;./arch/x86/include&#8221; -o -path &#8220;./include&#8221; \) -prune -o  -name &#8216;*.txt&#8217;  -o  -name &#8216;*.h&#8217;  -exec rm -vf  {} \;</p>
<p>#删除多余的firmware</p>
<p>rm -rf firmware/</p>
<p>#删除非x86cpu的代码</p>
<p>cd arch</p>
<p>rm -rvf  `<code>ls | grep -v "x86$" | grep -v "nios2$" | grep -v "Kconfig$"`</code></p>
<p>&nbsp;</p>
<p>清理完毕！</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Bash 中的特殊字符大全</title>
		<link>https://www.bhzhu203.com/2016/04/28/bash-%e4%b8%ad%e7%9a%84%e7%89%b9%e6%ae%8a%e5%ad%97%e7%ac%a6%e5%a4%a7%e5%85%a8/</link>
		
		<dc:creator><![CDATA[bhzhu203]]></dc:creator>
		<pubDate>Thu, 28 Apr 2016 07:56:59 +0000</pubDate>
				<category><![CDATA[linux知识]]></category>
		<category><![CDATA[Linux Unix]]></category>
		<category><![CDATA[PATH]]></category>
		<category><![CDATA[Sorry Sir]]></category>
		<guid isPermaLink="false">http://www.bhzhu203.com/?p=210</guid>

					<description><![CDATA[转自：https://linux.cn/article-5657-1.html  [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>转自：https://linux.cn/article-5657-1.html</p>
<div id="article_content">
<p>Linux下无论如何都是要用到shell命令的，在Shell的实际使用中，有编程经验的 很容易上手，但稍微有难度的是shell里面的那些个符号，各种特殊的符号在我们编写Shell脚本的时候如果能够用的好，往往能给我们起到事半功倍的效 果，为此，特地将Shell里面的一些符号说明罗列成对照表的形式，以便快速的查找。看看你知道下表中的哪些Shell符号呢？</p>
<p class="article_img"><img decoding="async" src="https://dn-linuxcn.qbox.me/data/attachment/album/201506/18/132144s7jwmbi7wbbm9rpp.jpg" alt="" /></p>
<p>Shell符号及各种解释对照表：</p>
<table class="table table-bordered" border="1" cellpadding="4">
<thead>
<tr>
<th><code>Shell符号</code></th>
<th>使用方法及说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>#</code></td>
<td>注释符号(Hashmark[Comments])</p>
<p>1.在shell文件的行首，作为shebang标记，#!/bin/bash;</p>
<p>2. 其他地方作为注释使用，在一行中，#后面的内容并不会被执行，除非；</p>
<p>3. 但是用单/双引号包围时，#作为#号字符本身，不具有注释作用。</td>
</tr>
<tr>
<td><code>;</code></td>
<td>作为多语句的分隔符(Command separator [semicolon])。</p>
<p>多个语句要放在同一行的时候，可以使用分号分隔。注意，有时候分号需要转义。</td>
</tr>
<tr>
<td><code>;;</code></td>
<td>连续分号(Terminator [double semicolon])。</p>
<p>在使用case选项的时候，作为每个选项的终结符。在Bash version 4+ 的时候，还可以使用[;;&amp;], [;&amp;]</td>
</tr>
<tr>
<td><code>.</code></td>
<td>点号(dot command [period])。</p>
<p>1. 相当于bash内建命令source，如：</p>
<ol class="linenums">
<li class="L0"><code><span class="com">#</span><span class="pun">!</span><span class="str">/bin/</span><span class="kwd">bash</span></code></li>
<li class="L1"><code><span class="pun">.</span><span class="pln"> data</span><span class="pun">-</span><span class="kwd">file</span></code></li>
<li class="L2"><code><span class="com">#包含</span><span class="pln">data</span><span class="pun">-</span><span class="kwd">file</span><span class="pun">;</span></code></li>
</ol>
<p>2. 作为文件名的一部分，在文件名的开头，表示该文件为隐藏文件，ls一般不显示出来（ls -a 可以显示）；</p>
<p>3. 作为目录名，一个点代表当前目录，两个点号代表上层目录（当前目录的父目录）。注意，两个以上的点不出现，除非你用引号（单/双）包围作为点号字符本身；</p>
<p>4. 正则表达式中，点号表示任意一个字符。</td>
</tr>
<tr>
<td><code>"</code></td>
<td>双引号（partial quoting [double quote]）。</p>
<p>部分引用。双引号包围的内容可以允许变量扩展，也允许转义字符的存在。如果字符串内出现双引号本身，需要转义，因此不一定双引号是成对的。</td>
</tr>
<tr>
<td><code>'</code></td>
<td>单引号(full quoting [single quote])。</p>
<p>单引号括住的内容，被视为单一字符串，引号内的禁止变量扩展，所有字符均作为字符本身处理（除单引号本身之外），单引号必须成对出现。</td>
</tr>
<tr>
<td><code>,</code></td>
<td>逗号(comma operator [comma])。</p>
<p>1. 用在连接一连串的数学表达式中，这串数学表达式均被求值，但只有最后一个求值结果被返回。如：</p>
<ol class="linenums">
<li class="L0"><code><span class="com">#</span><span class="pun">!</span><span class="str">/bin/</span><span class="kwd">bash</span></code></li>
<li class="L1"><code><span class="pln">let t1</span><span class="pun">=((</span><span class="pln">a</span><span class="pun">=</span><span class="lit">5</span><span class="pun">+</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">=</span><span class="lit">7</span><span class="pun">+</span><span class="lit">2</span><span class="pun">))</span></code></li>
<li class="L2"><code><span class="kwd">echo</span><span class="pln"> t1</span><span class="pun">=</span><span class="pln">$t1</span><span class="pun">,</span><span class="pln"> a</span><span class="pun">=</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">=</span><span class="pln">$b</span></code></li>
<li class="L3"><code><span class="com">##</span> <span class="pun">这个</span><span class="pln">$t1</span><span class="pun">=</span><span class="pln">$b</span><span class="pun">；</span></code></li>
</ol>
<p>2. 用于参数替代中，表示首字母小写，如果是两个逗号，则表示全部小写，注意，这个特性在bash version 4的时候被添加的。例子：</p>
<ol class="linenums">
<li class="L0"><code><span class="pln">a</span><span class="pun">=</span><span class="str">"ATest"</span></code></li>
<li class="L1"><code><span class="kwd">echo</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">a</span><span class="pun">,}</span></code></li>
<li class="L2"><code><span class="kwd">echo</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">a</span><span class="pun">,,}</span></code></li>
<li class="L3"><code><span class="com">##</span> <span class="pun">前面输出</span><span class="pln">aTest</span><span class="pun">，后面输出的是</span><span class="pln">atest</span><span class="pun">。</span></code></li>
</ol>
</td>
</tr>
<tr>
<td><code>\</code></td>
<td>反斜线，反斜杆(escape [backslash])。</p>
<p>1. 放在特殊符号之前，转义特殊符号的作用，仅表示特殊符号本身，这在字符串中常用；</p>
<p>2. 放在一行指令的最末端，表示紧接着的回车无效（其实也就是转义了Enter），后继新行的输入仍然作为当前指令的一部分。</td>
</tr>
<tr>
<td><code>/</code></td>
<td>斜线，斜杆（Filename path separator [forward slash]）。</p>
<p>1.作为路径的分隔符，路径中仅有一个斜杆表示根目录，以斜杆开头的路径表示从根目录开始的路径；</p>
<p>2.在作为运算符的时候，表示除法符号。如：<code>a=4/2</code></td>
</tr>
<tr>
<td><code>`</code></td>
<td>反引号，后引号（Command substitution[backquotes])。</p>
<p>命令替换。这个引号包围的为命令，可以执行包围的命令，并将执行的结果赋值给变量。如：<code>a=`dirname '/tmp/x.log'`</code> 。后面dirname返回的结果会赋值给a，注意，此处Mitchell特地使用了反引号和单引号，注意区别。</td>
</tr>
<tr>
<td><code>:</code></td>
<td>冒号(null command [colon])。</p>
<p>空命令，这个命令什么都不做，但是有返回值，返回值为0（即：true）。这个命令的作用非常奇妙。</p>
<p>1. 可做while死循环的条件；</p>
<p>2. 在if分支中作为占位符（即某一分支什么都不做的时候）；</p>
<p>3. 放在必须要有两元操作的地方作为分隔符，如：<code>: ${username=`whoami`}</code></p>
<p>4. 在参数替换中为字符串变量赋值，在重定向操作(&gt;)中，把一个文件长度截断为0（:&gt;&gt;这样用的时候，目标存在则什么都不做），这个只能在普通文件中使用，不能在管道，符号链接和其他特殊文件中使用；</p>
<p>5. 甚至你可以用来注释（#后的内容不会被检查，但:后的内容会被检查，如果有语句如果出现语法错误，则会报错）；</p>
<p>6. 你也可以作为域分隔符，比如环境变量$PATH中，或者passwd中，都有冒号的作为域分隔符的存在；</p>
<p>7. 你也可以将冒号作为函数名，不过这个会将冒号的本来意义转变（如果你不小心作为函数名，你可以使用<code>unset -f : </code>来取消function的定义）。</td>
</tr>
<tr>
<td><code>!</code></td>
<td>感叹号（reverse (or negate) [bang],[exclamation mark])。</p>
<p>取反一个测试结果或退出状态。</p>
<p>1. 表示反逻辑，比如后面的!=,这个是表示不等于；</p>
<p>2. 表示取反，如：ls a[!0-9] #表示a后面不是紧接一个数字的文件；</p>
<p>3. 在不同的环境里面，感叹号也可以出现在间接变量引用里面；</p>
<p>4. 在命令行中，可以用于历史命令机制的调用，你可以试试!$,!#，或者!-3看看，不过要注意，这点特性不能在脚本文件里面使用（被禁用）。</td>
</tr>
<tr>
<td><code>*</code></td>
<td>星号（wildcard/arithmetic operator[asterisk])。</p>
<p>1. 作为匹配文件名扩展的一个通配符，能自动匹配给定目录下的每一个文件；</p>
<p>2. 正则表达式中可以作为字符限定符，表示其前面的匹配规则匹配任意次；</p>
<p>3. 算术运算中表示乘法。</td>
</tr>
<tr>
<td><code>**</code></td>
<td>双星号(double asterisk)。算术运算中表示求幂运算。</td>
</tr>
<tr>
<td><code>?</code></td>
<td>问号（test operator/wildcard[Question mark])。</p>
<p>1. 表示条件测试；</p>
<p>2. 在双括号内表示C风格的三元操作符((condition?true-result:false-result))；</p>
<p>3. 参数替换表达式中用来测试一个变量是否设置了值；</p>
<p>4. 作为通配符，用于匹配文件名扩展特性中，用于匹配单个字符；</p>
<p>5. 正则表达式中，表示匹配其前面规则0次或者1次。</td>
</tr>
<tr>
<td><code>$</code></td>
<td>美元符号(Variable substitution[Dollar sign])。</p>
<p>1. 作为变量的前导符，用作变量替换，即引用一个变量的内容，比如：<code>echo $PATH</code>；</p>
<p>2. 在正则表达式中被定义为行末（End of line）。</td>
</tr>
<tr>
<td><code>${}</code></td>
<td>参数替换(Variable substitution)。</p>
<p>用于在字符串中表示变量。</td>
</tr>
<tr>
<td><code>$‘...’</code></td>
<td>引用内容展开，执行单引号内的转义内容（单引号原本是原样引用的），这种方式会将引号内的一个或者多个[\]转义后的八进制，十六进制值展开到ASCII或Unicode字符。</td>
</tr>
<tr>
<td><code>$*</code></p>
<p><code>$@</code></td>
<td>位置参数(Positional Parameters)。</p>
<p>这个在使用脚本文件的时候，在传递参数的时候会用到。两者都能返回调用脚本文件的所有参数，但$*是将所有参数作为一个整体返回（字符串），而$@ 是将每个参数作为单元返回一个参数列表。注意，在使用的时候需要用双引号将$*,$@括住。这两个变量受到$IFS的影响，如果在实际应用中，要考虑其中 的一些细节。</td>
</tr>
<tr>
<td><code>$#</code></td>
<td>表示传递给脚本的参数数量。</td>
</tr>
<tr>
<td><code>$?</code></td>
<td>此变量值在使用的时候，返回的是最后一个命令、函数、或脚本的退出状态码值，如果没有错误则是0，如果为非0，则表示在此之前的最后一次执行有错误。</td>
</tr>
<tr>
<td><code>$$</code></td>
<td>进程ID变量，这个变量保存了运行当前脚本的进程ID值。</td>
</tr>
<tr>
<td><code>()</code></td>
<td>圆括号(parentheses)。</p>
<p>1， 命令组（Command group）。由一组圆括号括起来的命令是命令组，命令组中的命令实在子shell（subshell）中执行。因为是在子shell内运行，因此在括号 外面是没有办法获取括号内变量的值，但反过来，命令组内是可以获取到外面的值，这点有点像局部变量和全局变量的关系，在实作中，如果碰到要cd到子目录操 作，并在操作完成后要返回到当前目录的时候，可以考虑使用subshell来处理；</p>
<p>2. 用于数组的初始化。</td>
</tr>
<tr>
<td><code>{x,y,z,...}</code></td>
<td>花括号扩展(Brace Expansion)。</p>
<p>在命令中可以用这种扩展来扩展参数列表，命令将会依照列表中的括号分隔开的模式进行匹配扩展。注意的一点是，这花括号扩展中不能有空格存在，如果确实有必要空格，则必须被转义或者使用引号来引用。例子：<code>echo {a,b,c}-{\ d," e",' f'}</code></td>
</tr>
<tr>
<td><code>{a..z}</code></td>
<td>在Bash version 3时添加了这种花括号扩展的扩展，可以使用{A..Z}表示A-Z的所有字符列表，这种方式的扩展Mitchell测试了一下，好像仅适用于A-Z，a-z，还有数字{最小..最大}的这种方式扩展。</td>
</tr>
<tr>
<td><code>{}</code></td>
<td>代码块(curly brackets)。</p>
<p>这个是匿名函数，但是又与函数不同，在代码块里面的变量在代码块后面仍能访问。注意：花括号内侧需要有空格与语句分隔。另外，在<code>xargs -i</code>中的话，还可以作为文本的占位符，用以标记输出文本的位置。</td>
</tr>
<tr>
<td><code>{} \;</code></td>
<td>这个{}是表示路径名，这个并不是shell内建的，现在接触到的情况看，好像只用在find命令里。注意后面的分号，这个是结束<code>find</code>命令中<code>-exec</code>选项的命令序列，在实际使用的时候，要转义一下以免被shell理解错误。</td>
</tr>
<tr>
<td><code>[]</code></td>
<td>中括号（brackets）。</p>
<p>1. 测试的表示，Shell会测试在[]内的表达式，需要注意的是，[]是Shell内建的测试的一部分，而非使用外部命令<code>/usr/bin/test</code>的链接；</p>
<p>2. 在数组的上下文中，表示数组元素，方括号内填上数组元素的位置就能获得对应位置的内容，如：</p>
<ol class="linenums">
<li class="L0"><code><span class="typ">Array</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]=</span><span class="pln">xxx</span></code></li>
<li class="L1"><code><span class="kwd">echo</span><span class="pln"> $</span><span class="pun">{</span><span class="typ">Array</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]};</span></code></li>
</ol>
<p>3. 表示字符集的范围，在正表达式中，方括号表示该位置可以匹配的字符集范围。</td>
</tr>
<tr>
<td><code>[[]]</code></td>
<td>双中括号(double brackets)。</p>
<p>这个结构也是测试，测试[[]]之中的表达式(Shell的关键字)。这个比单中括号更能防止脚本里面的逻辑错误，比 如：&amp;&amp;,||,&lt;,&gt;操作符能在一个[[]]里面测试通过，但是在[]却不能通过。[[]]里面没有文件名扩展 (filename expansion）或是词分隔符(Word splitting)，但是可以用参数扩展(Parameter expansion)和命令替换(command substitution)。不用文件名通配符和像空白这样的分隔符。注意，这里面如果出现了八进制，十六进制等，shell会自动执行转换比较。</td>
</tr>
<tr>
<td><code>$[...]</code></td>
<td>词表达表示整数扩展(integer expansion)。</p>
<p>在方括号里面执行整数表达式。例：</p>
<ol class="linenums">
<li class="L0"><code><span class="pln">a</span><span class="pun">=</span><span class="lit">3</span></code></li>
<li class="L1"><code><span class="pln">b</span><span class="pun">=</span><span class="lit">7</span></code></li>
<li class="L2"><code><span class="kwd">echo</span><span class="pln"> $</span><span class="pun">[</span><span class="pln">$a</span><span class="pun">+</span><span class="pln">$b</span><span class="pun">]</span></code></li>
<li class="L3"><code><span class="kwd">echo</span><span class="pln"> $</span><span class="pun">[</span><span class="pln">$a</span><span class="pun">*</span><span class="pln">$b</span><span class="pun">]</span></code></li>
<li class="L4"><code><span class="com">##返回是</span><span class="lit">10</span><span class="pun">和</span><span class="lit">21</span></code></li>
</ol>
</td>
</tr>
<tr>
<td><code>(())</code></td>
<td>双括号(double parentheses)。</p>
<p>表示整数扩展（integer expansion）。功能和上面的$[]差不多，但是需要注意的是，$[]是会返回里面表达式的值的，而(())只是执行，并不会返回值。两者执行后如 果变量值发生变化，都会影响到后继代码的运行。可对变量赋值，可以对变量进行一目操作符操作，也可以是二目，三目操作符。</td>
</tr>
<tr>
<td><code>&gt;</code></p>
<p><code>&amp;&lt;</code></p>
<p><code>&gt;&amp;</code></p>
<p><code>&gt;&gt;</code></p>
<p><code>&lt;</code></p>
<p><code>&lt;&gt;</code></td>
<td>重定向(redirection)。</p>
<p><code>scriptname &gt;filename</code> 重定向scriptname的输出到文件filename中去，如果文件存在则覆盖；</p>
<p><code>command &amp;&gt;filename</code> 重定向command的标准输出(stdout)和标准错误(stderr)到文件filename中；</p>
<p><code>command &gt;&amp;2</code> 把command的标准输出(stdout)重定向到标准错误(stderr)中；</p>
<p><code>scriptname &gt;&gt;filename</code> 把scriptname的输出（同&gt;)追加到文件filenmae中，如果文件不存在则创建。</p>
<p><code>[i]&lt;&gt;filename</code> 打开filename这个文件用来读或者写，并且给文件指定i为它的文件描述符(file descriptor)，文件不存在就会创建。</td>
</tr>
<tr>
<td><code>(command)&gt;</code></p>
<p><code>&lt;(command)</code></td>
<td>这是进程替换(Process Substitution)。</p>
<p>使用的时候注意，括号和&lt;,&gt;之间是不能有空格的，否则报错。其作用有点类似通道，但和管道在用法上又有些不同，管道是作为子进程的方式来运行的，这个命令会在<code>/dev/fd/</code>下面产生类似<code>/dev/fd/63</code>,<code>/dev/fd/62</code>这类临时文件，用来传递数据。</p>
<p>Mitchell个人猜测之所以用这种方法来传递，是因为前后两个不属于同一个进程，因此需要用共享文件的方式来传递资料(这么说其实管道也应该有同样的文件?)。网上有人说这个只是共享文件而已，但是经过测试，发现虽然有<code>/dev/fd/63</code>这样的文件产生，但是这个文件其实是指向pipe:[43434]这样的通道的链接。</td>
</tr>
<tr>
<td><code>&lt;&lt;</code></td>
<td>双小于号(here-document[double less then marks])。</p>
<p>这个也被称为Here-document，用来将后继的内容重定向到左侧命令的stdin中。&lt;&lt;可以节省格式化时间，别且使命令执行 的处理更容易。在实作的时候只需要输入&lt;&lt;和终止标志符，而后（一般是回车后）你就可以输入任何内容，只要在最后的新行中输入终止标志符，即 可完成数据的导入。使用here-document的时候，你可以保留空格，换行等。如果要让shell脚本更整洁一点，可以在&lt;&lt;和终止符 之间放上一个连字符(-)。</td>
</tr>
<tr>
<td><code>&lt;&lt;&lt;</code></td>
<td>三个小于号(here-strings)。Here-字串和Here-document类似，here-strings语法：<code>command [args] &lt;&lt;&lt;["]$word["]</code>；$word会展开并作为command的stdin。</td>
</tr>
<tr>
<td><code>&lt;</code></p>
<p><code>&gt;</code></td>
<td>小于，大于号(ASCII Comparison)。</p>
<p>ASCII比较，进行的是变量的ASCII比较，字串？数字?呃&#8230;这个&#8230;不就是ASCII比较么？</td>
</tr>
<tr>
<td><code>\&lt;...\&gt;</code></td>
<td>词界符(word boundary)。</p>
<p>这个是用在正则表达式中的一个特殊分隔符，用来标记单词的分界。比如：the会匹配there，another，them等等，如果仅仅要匹配the，就可以使用这个词界符，\&lt;the\&gt;就只能匹配the了。</td>
</tr>
<tr>
<td><code>|</code></td>
<td>管道(pipe)。管道是Linux，Unix都有的概念，是非常基础，也是非常重要的一个概念。它的作用是将管道前（左边）的命令产生的输出(stdout)作为管道后（右边）的命令的输入(stdin)。如：<code>ls | wc l</code>，使用管道就可以将命令连接在一起。注意：管道是每一个进程的标准输出都会作为下一个命令的标准输入，期间的标准输出不能跨越管道作为后继命令的标准输入，如： <code>cat filename | ls -al | sort</code> 。想想这个的输出? 同时，管道是以子进程来运行的，所以管道并不能引起变量改变。</td>
</tr>
<tr>
<td><code>&gt;|</code></td>
<td>强制重定向(force redirection)。</p>
<p>这会强制重写已经存在的文件。</td>
</tr>
<tr>
<td><code>&amp;</code></td>
<td>与号(Run job in background[ampersand])。</p>
<p>如果命令后面跟上一个&amp;符号，这个命令将会在后台运行。有的时候，脚本中在一条在后台运行的命令可能会引起脚本挂起，等待输入，出现这种情况可以在原有的脚本后面使用wait命令来修复。</td>
</tr>
<tr>
<td><code>&amp;&amp;</code></p>
<p><code>||</code></td>
<td>逻辑操作符(logical operator)。</p>
<p>在测试结构中，可以用这两个操作符来进行连接两个逻辑值。||是当测试条件有一个为真时返回0（真），全假为假；&amp;&amp;是当测试条件两个都为真时返回真(0)，有假为假。</td>
</tr>
<tr>
<td><code>-</code></td>
<td>减号，连字符(Hyphen/minus/dash)。</p>
<p>1. 作为选项，前缀[option, prefix]使用。用于命令或者过滤器的选项标志；操作符的前缀。如：</p>
<ol class="linenums">
<li class="L0"><code><span class="com">##</span><span class="pln"> COMMAND </span><span class="pun">-[选项列表]</span></code></li>
<li class="L1"><code><span class="kwd">ls</span> <span class="pun">-</span><span class="pln">al</span></code></li>
<li class="L2"><code><span class="kwd">sort</span> <span class="pun">-</span><span class="pln">dfu $file</span></code></li>
<li class="L3"><code><span class="kwd">set</span> <span class="pun">--</span><span class="pln"> $variable</span></code></li>
<li class="L4"><code> </code></li>
<li class="L5"><code><span class="kwd">if</span> <span class="pun">[</span><span class="pln"> $file </span><span class="pun">-</span><span class="pln">ot $file2 </span><span class="pun">]</span></code></li>
<li class="L6"><code><span class="kwd">then</span></code></li>
<li class="L7"><code> <span class="kwd">echo</span> <span class="str">"$file is older than $file2."</span></code></li>
<li class="L8"><code><span class="kwd">fi</span></code></li>
</ol>
<p>2. 用于stdin或者stdout的重定向的源或目的[dash].在tar没有bunzip2的程序补丁时，我们可以这样： <code>bunzip2 linux-2.6.13.tar.bz2 | tar xvf - </code>。将前面解压的数据作为tar的标准输入（这里使用一个-表示）</p>
<p>注意：在实作的时候，如果文件名是以[-]开头的，那么在加上这个作为定向操作符的时候，可能会出错，此时应该为文件加上合适的前缀路径，以避免这 种情况发生，同样的，在echo变量的时候，如果变量是以[-]开始，那么可能也会产生意想不到的结果，为了保险起见，可以使用双引号引用标量：</p>
<ol class="linenums">
<li class="L0"><code><span class="kwd">var</span><span class="pun">=</span><span class="str">"-n"</span></code></li>
<li class="L1"><code><span class="kwd">echo</span><span class="pln"> $var</span></code></li>
<li class="L2"><code><span class="com">##</span> <span class="pun">试试看有什么输出？</span></code></li>
</ol>
<p>还有，这种表示方法不是Bash内建的，要达到此点的这种效果，需要看你使用的软件是否支持这种操作；</p>
<p>3. 表示先前的工作目录(previous working directory)，因此，如果你cd到其他目录下要放回前一个路径的时候，可以使用cd -来达到目的，其实，这里的[-]使用的是环境变量的$OLDPWD，注意：这里的[-]和前一点是不同的；</p>
<p>4. 减号或者负号，用在算术操作中。</td>
</tr>
<tr>
<td><code>=</code></td>
<td>等号(Equals)。</p>
<p>1. 赋值操作，给变量赋值，么有空格在等号两侧；</p>
<p>2. 在比较测试中作为比较符出现，这里要注意，如果在中括号中作为比较出现，需要有空格符在等号左右两侧。</td>
</tr>
<tr>
<td><code>+</code></td>
<td>加号(Plus)。</p>
<p>1. 算术操作符，表示加法；</p>
<p>2. 在正则表达式中，表示的是其前的这个匹配规则匹配最少一次;</p>
<p>3.在命令或过滤器中作为选项标记，在某些命令或者内置命令中使用+来启用某些选项，使用-来禁止；</p>
<p>4. 在参数替换(parameter substitution)中，+前缀表示替代值(当变量为空的时候，使用+后面的值)</td>
</tr>
<tr>
<td><code>%</code></td>
<td>百分号(modulo[percent sign])。</p>
<p>1.在算术运算中，这个是求模操作符，即两个数进行除法运算后的余数；</p>
<p>2. 在参数替换(parameter substitution)中，可以作为模式匹配。例子：</p>
<ol class="linenums">
<li class="L0"><code><span class="pln">p</span><span class="pun">=</span><span class="pln">b</span><span class="pun">*</span><span class="lit">9</span></code></li>
<li class="L1"><code><span class="kwd">var</span><span class="pun">=</span><span class="str">"abcd12345abc479"</span></code></li>
<li class="L2"><code><span class="kwd">echo</span><span class="pln"> $</span><span class="pun">{</span><span class="kwd">var</span><span class="pun">%</span><span class="pln">p</span><span class="pun">},</span><span class="pln"> $</span><span class="pun">{</span><span class="kwd">var</span><span class="pun">%%</span><span class="pln">p</span><span class="pun">}</span></code></li>
<li class="L3"><code><span class="com">##从右边开始查找(想想从左是那个符号?)</span></code></li>
<li class="L4"><code><span class="com">##任何在</span><span class="pln">b</span><span class="pun">和</span><span class="lit">9</span><span class="pun">之间的内容（含）</span></code></li>
<li class="L5"><code><span class="com">##第一个是找到最短的符合匹配项</span></code></li>
<li class="L6"><code><span class="com">##后一个是找最大符合的匹配项（贪婪匹配?)</span></code></li>
</ol>
</td>
</tr>
<tr>
<td><code>~</code></td>
<td>波浪号(Home directory[tilde])。</p>
<p>这个和内部变量$HOME是一样的。默认表示当前用户的家目录（主目录），这个和~/效果一致，如果波浪号后面跟用户名，表示是该用户的家目录。</td>
</tr>
<tr>
<td><code>~+</code></td>
<td>当前的工作目录(current working directory)。</p>
<p>这个和内置变量$PWD一样。</td>
</tr>
<tr>
<td><code>~-</code></td>
<td>前一个工作目录(previous working directory)。</p>
<p>这个和内部变量$OLDPWD一致，之前的[-]也一样。</td>
</tr>
<tr>
<td><code>=~</code></td>
<td>Bash 版本3中有介绍，这个是正则表达式匹配。可用在[[]]测试中，比如：</p>
<ol class="linenums">
<li class="L0"><code><span class="kwd">var</span><span class="pun">=</span><span class="str">"this is a test message."</span></code></li>
<li class="L1"><code><span class="pun">[[</span> <span class="str">"$var"</span> <span class="pun">=~</span><span class="pln"> tf</span><span class="pun">*</span><span class="pln">message </span><span class="pun">]]</span> <span class="pun">&amp;&amp;</span> <span class="kwd">echo</span> <span class="str">"Sir. Found that."</span> <span class="pun">||</span> <span class="kwd">echo</span> <span class="str">"Sorry Sir. No match be found."</span></code></li>
<li class="L2"><code><span class="com">##你可以修改中间的正则表达式匹配项，正则表达式可以但不一定需要使用双引号括起来。</span></code></li>
</ol>
</td>
</tr>
<tr>
<td><code>^</code></td>
<td>脱字符(caret)。</p>
<p>1. 在正则表达式中，作为一行的行首(beginning-of-line)位置标志符；</p>
<p>2. 在参数替换(Parameter substitution)中，这个用法有两种，一个脱字符(<code>${var^}</code>)，或两个(<code>${var^^}</code>)，分别表示第一个字母大写，全部大写的意思(Bash version &gt;=4)。</td>
</tr>
<tr>
<td><code>空白</code></td>
<td>空白符(Whitespace)。</p>
<p>空白符不仅仅是指空格(spaces)，还包括制表符(tabs)，空行(blank lines)，或者这几种的组合。可用做函数的分隔符,分隔命令或变量，空行不会影响脚本的行为，因此可以用它来规划脚本代码，以增加可读性，在内置的特 殊变量$IFS可以用来针对某些命令进行输入的参数进行分割，其默认就是空白符。在字符串或变量中如果有空白符，可以使用引号来规避可能的错误。</td>
</tr>
</tbody>
</table>
<p>怎样，你有多少是了解的呢？Mitchell在开始的Shell脚本时候，发现在这里面有好多都是不认识呢。</p>
<p>说明：因为涉及到翻译，文中内容不一定完全翻译准确，如果你发现有错误的地方，还请包涵指正。</p>
<p>参考：</p>
<ol>
<li>本文主要内容来源：<a class="ext" href="http://tldp.org/LDP/abs/html/index.html" target="_blank" rel="external nofollow">Advanced Bash-Scripting Guide</a></li>
<li><a class="ext" href="http://www.ibm.com/developerworks/cn/aix/library/au-spunix_clitricks/" target="_blank" rel="external nofollow">对话 UNIX: !$#@*%</a></li>
<li><a class="ext" href="http://zh.wikipedia.org/wiki/Here%E6%96%87%E6%A1%A3" target="_blank" rel="external nofollow">wikipedia的Here文档</a></li>
</ol>
<p>参考内容为本篇成文之际给予Mitchell帮助较大的文章，在整个过程中还有很多网站信息给我提供了帮助，在此对他们的作者的无私贡献表示感谢！</p>
<p>（注：转载过程中有细节修改。）</p>
</div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
