special-chars.html

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

HTML
4,290
字号
CLASS="RETURNVALUE">0</SPAN>). 	    </P></DIV><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;:  2&nbsp;echo $?   # 0</PRE></FONT></TD></TR></TABLE></P><P>死循环:</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;while :  2&nbsp;do  3&nbsp;   operation-1  4&nbsp;   operation-2  5&nbsp;   ...  6&nbsp;   operation-n  7&nbsp;done  8&nbsp;  9&nbsp;# 与下边相同: 10&nbsp;#    while true 11&nbsp;#    do 12&nbsp;#      ... 13&nbsp;#    done</PRE></FONT></TD></TR></TABLE>	    </P><P>在if/then中的占位符:</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;if condition  2&nbsp;then :   # 什么都不做,引出分支.   3&nbsp;else  4&nbsp;   take-some-action  5&nbsp;fi</PRE></FONT></TD></TR></TABLE>	    </P><P>在一个二元命令中提供一个占位符, 具体参见<AHREF="ops.html#ARITHOPS">例子 8-2</A>, 		和<AHREF="parameter-substitution.html#DEFPARAM">默认参数</A>.</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;: ${username=`whoami`}  2&nbsp;# ${username=`whoami`}   如果没有开头的":"的话, 将会给出一个错误,   3&nbsp;#                        除非"username"是一个命令或者内建命令...</PRE></FONT></TD></TR></TABLE></P><P>在<AHREF="here-docs.html#HEREDOCREF">here document</A>中提供一个命令所需的占位符. 		参见<AHREF="here-docs.html#ANONHEREDOC">例子 17-10</A>. </P><P>使用<AHREF="parameter-substitution.html#PARAMSUBREF">参数替换</A>来评估字符串变量		(参见<AHREF="parameter-substitution.html#EX6">例子 9-15</A>).	    <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;: ${HOSTNAME?} ${USER?} ${MAIL?}  2&nbsp;#  如果一个或多个必要的环境变量没被设置的话,   3&nbsp;#+ 就打印错误信息. </PRE></FONT></TD></TR></TABLE>		</P><P><BCLASS="COMMAND"><AHREF="parameter-substitution.html#EXPREPL1">变量扩展/子串替换</A></B>. </P><P>在与<SPANCLASS="TOKEN">&#62;</SPAN><AHREF="io-redirection.html#IOREDIRREF">重定向操作符</A>结合使用时,	      将会把一个文件清空, 但是并不会修改这个文件的权限. 	      如果之前这个文件并不存在, 那么就创建这个文件. 	      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;: &#62; data.xxx   # 文件"data.xxx"现在被清空了.   2&nbsp;  3&nbsp;# 与 cat /dev/null &#62;data.xxx 的作用相同   4&nbsp;# 然而,这并不会产生一个新的进程, 因为":"是一个内建命令. </PRE></FONT></TD></TR></TABLE>              参见<AHREF="textproc.html#EX12">例子 12-14</A>.</P><P>在与<SPANCLASS="TOKEN">&#62;&#62;</SPAN>重定向操作符结合使用时, 				  将不会对预先存在的目标文件(<KBDCLASS="USERINPUT">: &#62;&#62; target_file</KBD>)产生任何影响. 	      如果这个文件之前并不存在, 那么就创建它. </P><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>这只适用于正规文件, 而不适用于管道, 			  符号连接, 和某些特殊文件. </P></TD></TR></TABLE></DIV><P>也可能用来作为注释行, 虽然我们不推荐这么做.		使用<SPANCLASS="TOKEN">#</SPAN>来注释的话, 将关闭剩余行的错误检查, 		所以可以在注释行中写任何东西. 	    然而, 使用<SPANCLASS="TOKEN">:</SPAN>的话将不会这样.	      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;: This is a comment that generates an error, ( if [ $x -eq 3] ).</PRE></FONT></TD></TR></TABLE>	    </P><P><SPANCLASS="QUOTE">"<SPANCLASS="TOKEN">:</SPAN>"</SPAN>还用来在<TTCLASS="FILENAME">/etc/passwd</TT>和<AHREF="internalvariables.html#PATHREF">$PATH</A>变量中做分隔符.	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $PATH</KBD><SAMPCLASS="COMPUTEROUTPUT">/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games</SAMP></PRE></FONT></TD></TR></TABLE>	    </P></DD><DT><SPANCLASS="TOKEN">!</SPAN></DT><DD><P><ANAME="NOTREF"></A></P><DIVCLASS="FORMALPARA"><P><B>取反操作符[叹号, 即!]. </B><SPANCLASS="TOKEN">!</SPAN>操作符将会反转命令的<AHREF="exit-status.html#EXITSTATUSREF">退出码</A>的结果, 		(具体参见<AHREF="exit-status.html#NEGCOND">例子 6-2</A>). 也会反转测试操作符的意义, 			比如修改<SPANCLASS="QUOTE">"等号"</SPAN>( <AHREF="comparison-ops.html#EQUALSIGNREF">=</A> )为<SPANCLASS="QUOTE">"不等号"</SPAN>( != ). 			<SPANCLASS="TOKEN">!</SPAN>操作符是Bash的<AHREF="internal.html#KEYWORDREF">关键字</A>. </P></DIV><P>在一个不同的上下文中, 			<SPANCLASS="TOKEN">!</SPAN>也会出现在<AHREF="ivr.html#IVRREF">变量的间接引用</A>中. </P><P>在另一种上下文中, 如<EM>命令行</EM>模式下, 		<SPANCLASS="TOKEN">!</SPAN>还能反转bash的<EM>历史机制</EM> (参见<AHREF="histcommands.html">Appendix J</A>). 			需要注意的是, 在一个脚本中, <EM>历史机制</EM>是被禁用的. </P></DD><DT><SPANCLASS="TOKEN">*</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>通配符[星号, 即*]. </B><SPANCLASS="TOKEN">*</SPAN>可以用来做文件名匹配(这个东西有个专有名词叫<AHREF="globbingref.html">globbing</A>)的<SPANCLASS="QUOTE">"通配符"</SPAN>. 		含义是, 可以用来匹配给定目录下的任何文件名. </P></DIV><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo *</KBD><SAMPCLASS="COMPUTEROUTPUT">abs-book.sgml add-drive.sh agram.sh alias.sh</SAMP>	      </PRE></FONT></TD></TR></TABLE>	    </P><P><SPANCLASS="TOKEN">*</SPAN>也可以用在<AHREF="regexp.html#REGEXREF">正则表达式</A>中, 用来匹配任意个数(包含0个)的字符. </P></DD><DT><SPANCLASS="TOKEN">*</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><AHREF="ops.html#AROPS1">算术操作符</A>. </B>在算术操作符的上下文中, <SPANCLASS="TOKEN">*</SPAN>号表示乘法运算. </P></DIV><P>如果要做求幂运算, 使用<SPANCLASS="TOKEN">**</SPAN>, 			这是<AHREF="ops.html#EXPONENTIATIONREF">求幂操作符</A>. </P></DD><DT><SPANCLASS="TOKEN">?</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>测试操作符. </B>在一个特定的表达式中, <SPANCLASS="TOKEN">?</SPAN>用来测试一个条件的结果. </P></DIV><P>在一个<AHREF="dblparens.html">双括号结构</A>中, 		<SPANCLASS="TOKEN">?</SPAN>就是C语言的三元操作符. 参见<AHREF="dblparens.html#CVARS">例子 9-31</A>.</P><P>在<AHREF="parameter-substitution.html#PARAMSUBREF">参数替换</A>表达式中, 			<SPANCLASS="TOKEN">?</SPAN><AHREF="parameter-substitution.html#QERRMSG">用来测试一个变量是否被set了. </A>.</P></DD><DT><SPANCLASS="TOKEN">?</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>通配符. </B><SPANCLASS="TOKEN">?</SPAN>在<AHREF="globbingref.html">通配(globbing)</A>中, 				  用来做匹配单个字符的<SPANCLASS="QUOTE">"通配符"</SPAN>, 				  在<AHREF="x13673.html#EXTREGEX">正则表达式</A>中, 			也是用来<AHREF="x13673.html#QUEXREGEX">表示一个字符</A>. </P></DIV></DD><DT><SPANCLASS="TOKEN">$</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><AHREF="varsubn.html">变量替换</A>(引用变量的内容). </B>	       <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;var1=5  2&nbsp;var2=23skidoo  3&nbsp;  4&nbsp;echo $var1     # 5  5&nbsp;echo $var2     # 23skidoo</PRE></FONT></TD></TR></TABLE>	       </P></DIV><P>在一个变量前面加上<SPANCLASS="TOKEN">$</SPAN>用来引用这个变量的<EM>值</EM>. </P></DD><DT><SPANCLASS="TOKEN">$</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>行结束符. </B>在<AHREF="regexp.html#REGEXREF">正则表达式中</A>, 		<SPANCLASS="QUOTE">"$"</SPAN>表示行结束符. </P></DIV></DD><DT><SPANCLASS="TOKEN">${}</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><AHREF="parameter-substitution.html#PARAMSUBREF">参数替换</A>. </B></P></DIV></DD><DT><SPANCLASS="TOKEN">$*</SPAN>, <SPANCLASS="TOKEN">$@</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><AHREF="internalvariables.html#APPREF">位置参数</A>. </B></P></DIV></DD><DT><SPANCLASS="TOKEN">$?</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>退出状态码变量. </B><AHREF="exit-status.html#EXSREF">$? 变量</A>			  保存了一个命令, 一个<AHREF="functions.html#FUNCTIONREF">函数</A>, 			  或者是脚本本身的<AHREF="exit-status.html#EXITSTATUSREF">退出状态码</A>. </P></DIV></DD><DT><ANAME="PROCESSIDREF"></A><SPANCLASS="TOKEN">$$</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>进程ID变量. </B>这个<AHREF="internalvariables.html#PROCCID">$$ 变量</A>	        保存了它所在脚本的<EM>进程 ID</EM>		  <ANAME="AEN907"HREF="#FTN.AEN907"><SPANCLASS="footnote">[1]</SPAN></A></P></DIV></DD><DT><SPANCLASS="TOKEN">()</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>命令组. </B><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;(a=hello; echo $a)</PRE></FONT></TD></TR></TABLE></P></DIV><DIVCLASS="IMPORTANT"><P></P><TABLECLASS="IMPORTANT"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/important.gif"HSPACE="5"ALT="Important"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>在<TTCLASS="REPLACEABLE"><I>括号</I></TT>中的命令列表, 		 将会作为一个<AHREF="subshells.html#SUBSHELLSREF">子shell</A>来运行.</P><P>在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的.	      父进程, 也就是脚本本身, 	      <AHREF="subshells.html#PARVIS">将不能够读取在子进程中创建的变量</A>, 也就是在子shell中创建的变量.	      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;a=123  2&nbsp;( a=321; )	        3&nbsp;  4&nbsp;echo "a = $a"   # a = 123  5&nbsp;# 在圆括号中a变量, 更像是一个局部变量. </PRE></FONT></TD></TR></TABLE></P></TD></TR></TABLE></DIV><DIVCLASS="FORMALPARA"><P><B>初始化数组. </B><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;Array=(element1 element2 element3)</PRE></FONT></TD></TR></TABLE></P></DIV></DD><DT><SPANCLASS="TOKEN">{xxx,yyy,zzz,...}</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>大括号扩展. </B><ANAME="BRACEEXPREF"></A><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;cat {file1,file2,file3} &#62; combined_file  2&nbsp;# 把file1, file2, file3连接在一起, 并且重定向到combined_file中.  3&nbsp;  4&nbsp;  5&nbsp;cp file22.{txt,backup}  6&nbsp;# 拷贝"file22.txt"到"file22.backup"中</PRE></FONT></TD></TR></TABLE></P></DIV><P>一个命令可能会对<TTCLASS="REPLACEABLE"><I>大括号</I></TT>	     <ANAME="AEN950"HREF="#FTN.AEN950"><SPANCLASS="footnote">[2]</SPAN></A>	     	  中的以逗号分割的文件列表起作用. 	  (<AHREF="globbingref.html">通配(globbing)</A>)将对大括号中的文件名做扩展. </P><DIV

⌨️ 快捷键说明

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