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 : 2 echo $? # 0</PRE></FONT></TD></TR></TABLE></P><P>死循环:</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 while : 2 do 3 operation-1 4 operation-2 5 ... 6 operation-n 7 done 8 9 # 与下边相同: 10 # while true 11 # do 12 # ... 13 # 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 if condition 2 then : # 什么都不做,引出分支. 3 else 4 take-some-action 5 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 : ${username=`whoami`} 2 # ${username=`whoami`} 如果没有开头的":"的话, 将会给出一个错误, 3 # 除非"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 : ${HOSTNAME?} ${USER?} ${MAIL?} 2 # 如果一个或多个必要的环境变量没被设置的话, 3 #+ 就打印错误信息. </PRE></FONT></TD></TR></TABLE> </P><P><BCLASS="COMMAND"><AHREF="parameter-substitution.html#EXPREPL1">变量扩展/子串替换</A></B>. </P><P>在与<SPANCLASS="TOKEN">></SPAN><AHREF="io-redirection.html#IOREDIRREF">重定向操作符</A>结合使用时, 将会把一个文件清空, 但是并不会修改这个文件的权限. 如果之前这个文件并不存在, 那么就创建这个文件. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 : > data.xxx # 文件"data.xxx"现在被清空了. 2 3 # 与 cat /dev/null >data.xxx 的作用相同 4 # 然而,这并不会产生一个新的进程, 因为":"是一个内建命令. </PRE></FONT></TD></TR></TABLE> 参见<AHREF="textproc.html#EX12">例子 12-14</A>.</P><P>在与<SPANCLASS="TOKEN">>></SPAN>重定向操作符结合使用时, 将不会对预先存在的目标文件(<KBDCLASS="USERINPUT">: >> 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 : 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 var1=5 2 var2=23skidoo 3 4 echo $var1 # 5 5 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 (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 a=123 2 ( a=321; ) 3 4 echo "a = $a" # a = 123 5 # 在圆括号中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 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 cat {file1,file2,file3} > combined_file 2 # 把file1, file2, file3连接在一起, 并且重定向到combined_file中. 3 4 5 cp file22.{txt,backup} 6 # 拷贝"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 + -
显示快捷键?