special-chars.html

来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 4,290 行 · 第 1/5 页

HTML
4,290
字号
CLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>在大括号中, 不允许有空白, <EM>除非</EM>这个空白被引用或转义. </P><P><KBDCLASS="USERINPUT">echo {file1,file2}\ :{\ A," B",' C'}</KBD></P><P><SAMPCLASS="COMPUTEROUTPUT">file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C</SAMP></P></TD></TR></TABLE></DIV></DD><DT><SPANCLASS="TOKEN">{}</SPAN></DT><DD><P><ANAME="CODEBLOCKREF"></A></P><DIVCLASS="FORMALPARA"><P><B>代码块[大括号, 即{}]. </B>又被称为<ICLASS="FIRSTTERM">内部组</I>,		这个结构事实上创建了一个<ICLASS="FIRSTTERM">匿名函数</I>(一个没有名字的函数). 		然而, 与<SPANCLASS="QUOTE">"标准"</SPAN><AHREF="functions.html#FUNCTIONREF">函数</A>不同的是, 		在其中声明的变量,对于脚本其他部分的代码来说还是可见的. </P></DIV><P> <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">{ local a;	      a=123; }</KBD><SAMPCLASS="COMPUTEROUTPUT">bash: local: can only be used in afunction</SAMP>	      </PRE></FONT></TD></TR></TABLE> </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;a=123  2&nbsp;{ a=321; }  3&nbsp;echo "a = $a"   # a = 321   (说明在代码块中对变量a所作的修改, 影响了外边的变量)  4&nbsp;  5&nbsp;# 感谢, S.C.</PRE></FONT></TD></TR></TABLE></P><P>下边的代码展示了在大括号结构中代码的<AHREF="io-redirection.html#IOREDIRREF">I/O 重定向</A>. </P><DIVCLASS="EXAMPLE"><HR><ANAME="EX8"></A><P><B>例子 3-1. 代码块和I/O重定向</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# 从/etc/fstab中读行.  3&nbsp;  4&nbsp;File=/etc/fstab  5&nbsp;  6&nbsp;{  7&nbsp;read line1  8&nbsp;read line2  9&nbsp;} &#60; $File 10&nbsp; 11&nbsp;echo "First line in $File is:" 12&nbsp;echo "$line1" 13&nbsp;echo 14&nbsp;echo "Second line in $File is:" 15&nbsp;echo "$line2" 16&nbsp; 17&nbsp;exit 0 18&nbsp; 19&nbsp;# 现在, 你怎么分析每行的分割域? 20&nbsp;# 小提示: 使用awk.</PRE></FONT></TD></TR></TABLE><HR></DIV><DIVCLASS="EXAMPLE"><HR><ANAME="RPMCHECK"></A><P><B>例子 3-2. 将一个代码块的结果保存到文件</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# rpm-check.sh  3&nbsp;  4&nbsp;# 这个脚本的目的是为了描述, 列表, 和确定是否可以安装一个rpm包.  5&nbsp;# 在一个文件中保存输出.  6&nbsp;#   7&nbsp;# 这个脚本使用一个代码块来展示.  8&nbsp;  9&nbsp;SUCCESS=0 10&nbsp;E_NOARGS=65 11&nbsp; 12&nbsp;if [ -z "$1" ] 13&nbsp;then 14&nbsp;  echo "Usage: `basename $0` rpm-file" 15&nbsp;  exit $E_NOARGS 16&nbsp;fi   17&nbsp; 18&nbsp;{  19&nbsp;  echo 20&nbsp;  echo "Archive Description:" 21&nbsp;  rpm -qpi $1       # 查询说明. 22&nbsp;  echo 23&nbsp;  echo "Archive Listing:" 24&nbsp;  rpm -qpl $1       # 查询列表. 25&nbsp;  echo 26&nbsp;  rpm -i --test $1  # 查询rpm包是否可以被安装. 27&nbsp;  if [ "$?" -eq $SUCCESS ] 28&nbsp;  then 29&nbsp;    echo "$1 can be installed." 30&nbsp;  else 31&nbsp;    echo "$1 cannot be installed." 32&nbsp;  fi   33&nbsp;  echo 34&nbsp;} &#62; "$1.test"       # 把代码块中的所有输出都重定向到文件中. 35&nbsp; 36&nbsp;echo "Results of rpm test in file $1.test" 37&nbsp; 38&nbsp;# 查看rpm的man页来查看rpm的选项. 39&nbsp; 40&nbsp;exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>与上面所讲到的()中的命令组不同的是, 		{大括号}中的代码块将<EM>不会</EM>开启一个新的<AHREF="subshells.html#SUBSHELLSREF">子shell</A>.		<ANAME="AEN1001"HREF="#FTN.AEN1001"><SPANCLASS="footnote">[3]</SPAN></A>	      </P></TD></TR></TABLE></DIV></DD><DT><SPANCLASS="TOKEN">{} \;</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>路径名. </B>一般都在<AHREF="moreadv.html#FINDREF">find</A>命令中使用. 		这<EM>不是</EM>一个shell<AHREF="internal.html#BUILTINREF">内建命令</A>. </P></DIV><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><SPANCLASS="QUOTE">"<SPANCLASS="TOKEN">;</SPAN>"</SPAN>用来结束<BCLASS="COMMAND">find</B>命令序列的<CODECLASS="OPTION">-exec</CODE>选项. 		 它需要被保护以防止被shell所解释. </P></TD></TR></TABLE></DIV></DD><DT><SPANCLASS="TOKEN">[ ]</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>条件测试. </B></P></DIV><P><ANAME="LEFTBRACKET"></A><AHREF="tests.html#IFTHEN">条件测试</A>表达式放在<BCLASS="COMMAND">[ ]</B>中. 		值得注意的是<BCLASS="COMMAND">[</B>是shell内建<BCLASS="COMMAND">test</B>命令的一部分, 		<EM>并不是</EM><TTCLASS="FILENAME">/usr/bin/test</TT>中的外部命令的一个链接.</P></DD><DT><SPANCLASS="TOKEN">[[ ]]</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>测试. </B></P></DIV><P>测试表达式放在<SPANCLASS="TOKEN">[[ ]]</SPAN>中. (shell<AHREF="internal.html#KEYWORDREF">关键字</A>). </P><P>具体参见关于<AHREF="testconstructs.html#DBLBRACKETS">[[ ... ]]结构的讨论</A>.</P></DD><DT><SPANCLASS="TOKEN">[ ]</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>数组元素. </B></P></DIV><P>在一个<AHREF="arrays.html#ARRAYREF">array</A>结构的上下文中,	       中括号用来引用数组中每个元素的编号. 	         <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;Array[1]=slot_1  2&nbsp;echo ${Array[1]}</PRE></FONT></TD></TR></TABLE></P></DD><DT><SPANCLASS="TOKEN">[ ]</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>字符范围. </B></P></DIV><P>用作<AHREF="regexp.html#REGEXREF">正则表达式</A>的一部分, 	       方括号描述一个匹配的<AHREF="x13673.html#BRACKETSREF">字符范围</A>. </P></DD><DT><SPANCLASS="TOKEN">(( ))</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>整数扩展. </B></P></DIV><P>扩展并计算在<SPANCLASS="TOKEN">(( ))</SPAN>中的整数表达式. </P><P>请参考关于<AHREF="dblparens.html">(( ... )) 结构</A>的讨论.</P></DD><DT><SPANCLASS="TOKEN">&#62;</SPAN> <SPANCLASS="TOKEN">&#38;&#62;</SPAN> <SPANCLASS="TOKEN">&#62;&#38;</SPAN> <SPANCLASS="TOKEN">&#62;&#62;</SPAN> <SPANCLASS="TOKEN">&#60;</SPAN> <SPANCLASS="TOKEN">&#60;&#62;</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><AHREF="io-redirection.html#IOREDIRREF">重定向</A>. </B></P></DIV><P>			<KBDCLASS="USERINPUT">scriptname &#62;filename</KBD> 			重定向<TTCLASS="FILENAME">scriptname</TT>的输出到文件<TTCLASS="FILENAME">filename</TT>中. 			如果<TTCLASS="FILENAME">filename</TT>存在的话, 那么将会被覆盖. </P><P>			<KBDCLASS="USERINPUT">command &#38;&#62;filename</KBD> 			重定向<TTCLASS="FILENAME">command</TT>的<TTCLASS="FILENAME">stdout</TT>和<TTCLASS="FILENAME">stderr</TT>到<TTCLASS="FILENAME">filename</TT>中. </P><P><KBDCLASS="USERINPUT">command &#62;&#38;2</KBD> 重定向<TTCLASS="FILENAME">command</TT>的<TTCLASS="FILENAME">stdout</TT>到<TTCLASS="FILENAME">stderr</TT>中. </P><P><KBDCLASS="USERINPUT">scriptname &#62;&#62;filename</KBD> 			把<TTCLASS="FILENAME">scriptname</TT>的输出追加到文件<TTCLASS="FILENAME">filename</TT>中. 			如果<TTCLASS="FILENAME">filename</TT>不存在的话, 	      将会被创建. </P><P><KBDCLASS="USERINPUT">[i]&#60;&#62;filename</KBD>			打开文件<TTCLASS="FILENAME">filename</TT>用来读写, 			并且分配<AHREF="io-redirection.html#FDREF">文件描述符</A><SPANCLASS="TOKEN">i</SPAN>给这个文件. 			如果<TTCLASS="FILENAME">filename</TT>不存在, 这个文件将会被创建. </P><DIVCLASS="FORMALPARA"><P><B><AHREF="process-sub.html#PROCESSSUBREF">进程替换</A>. </B></P></DIV><P><KBDCLASS="USERINPUT">(command)&#62;</KBD></P><P><KBDCLASS="USERINPUT">&#60;(command)</KBD></P><P><AHREF="comparison-ops.html#LTREF">在一种不同的上下文中</A>,			<SPANCLASS="QUOTE">"<SPANCLASS="TOKEN">&#60;</SPAN>"</SPAN>和<SPANCLASS="QUOTE">"<SPANCLASS="TOKEN">&#62;</SPAN>"</SPAN>可用来做			<AHREF="comparison-ops.html#SCOMPARISON1">字符串比较操作</A>. </P><P><AHREF="comparison-ops.html#INTLT">在另一种上下文中</A>,			<SPANCLASS="QUOTE">"<SPANCLASS="TOKEN">&#60;</SPAN>"</SPAN>和<SPANCLASS="QUOTE">"<SPANCLASS="TOKEN">&#62;</SPAN>"</SPAN>可用来做			<AHREF="comparison-ops.html#ICOMPARISON1">整数比较操作</A>. 			参见<AHREF="moreadv.html#EX45">例子 12-9</A>. </P></DD><DT><SPANCLASS="TOKEN">&#60;&#60;</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>用在<AHREF="here-docs.html#HEREDOCREF">here document</A>中的重定向. </B></P></DIV></DD><DT><SPANCLASS="TOKEN">&#60;&#60;&#60;</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>用在<AHREF="x13628.html#HERESTRINGSREF">here string</A>中的重定向. </B></P></DIV></DD><DT><SPANCLASS="TOKEN">&#60;</SPAN>, <SPANCLASS="TOKEN">&#62;</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><AHREF="comparison-ops.html#LTREF">ASCII	    comparison</A>. </B><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;veg1=carrots  2&nbsp;veg2=tomatoes  3&nbsp;  4&nbsp;if [[ "$veg1" &#60; "$veg2" ]]  5&nbsp;then  6&nbsp;  echo "Although $veg1 precede $veg2 in the dictionary,"  7&nbsp;  echo "this implies nothing about my culinary preferences."  8&nbsp;else  9&nbsp;  echo "What kind of dictionary are you using, anyhow?" 10&nbsp;fi</PRE></FONT></TD></TR></TABLE></P></DIV></DD><DT><SPANCLASS="TOKEN">\&#60;</SPAN>, <SPANCLASS="TOKEN">\&#62;</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>				  <AHREF="regexp.html#REGEXREF">正则表达式</A>中的<AHREF="x13673.html#ANGLEBRAC">单词边界</A>			  . </B></P></DIV><P><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">grep '\&#60;the\&#62;' textfile</KBD></P></DD><DT><SPANCLASS="TOKEN">|</SPAN></DT><DD><P><ANAME="PIPEREF"></A></P><DIVCLASS="FORMALPARA"><P><B>管道. </B>分析前边命令的输出, 			  并将输出作为后边命令的输入. 			  这是一种产生命令链的好方法. </P></DIV><P>              <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;echo ls -l | sh  2&nbsp;#  传递"echo ls -l"的输出到shell中,  3&nbsp;#+ 与一个简单的"ls -l"结果相同.  4&nbsp;  5&nbsp;  6&nbsp;cat *.lst | sort | uniq  7&nbsp;# 合并和排序所有的".lst"文件, 然后删除所有重复的行. </PRE></FONT></TD></TR></TABLE>	    </P><TABLECLASS="SIDEBAR"BORDER="1"CELLPADDING="5"><TR><TD><DIVCLASS="SIDEBAR"><P></P><ANAME="AEN1279"></A><P>管道是进程间通讯的一个典型办法, 				将一个进程的<TTCLASS="FILENAME">stdout</TT>放到另一个进程的<TTCLASS="FILENAME">stdin</TT>中. 	      标准的方法是将一个一般命令的输出, 	      比如<AHREF="basic.html#CATREF">cat</A>或者<AHREF="internal.html#ECHOREF"

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?