special-chars.html
来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 4,290 行 · 第 1/5 页
HTML
4,290 行
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>特殊字符</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="基本"HREF="part2.html"><LINKREL="PREVIOUS"TITLE="基本"HREF="part2.html"><LINKREL="NEXT"TITLE="变量和参数的介绍"HREF="variables.html"></HEAD><BODYCLASS="CHAPTER"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="part2.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom"></TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="variables.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="CHAPTER"><H1><ANAME="SPECIAL-CHARS"></A>3. 特殊字符</H1><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="SCHARLIST1"></A>用在脚本和其他地方的特殊字符</B></P><DL><DT><SPANCLASS="TOKEN">#</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>注释. </B>行首以<SPANCLASS="TOKEN">#</SPAN>(<AHREF="sha-bang.html#MAGNUMREF"><SPANCLASS="TOKEN">#!</SPAN>是个例外</A>)开头是注释. </P></DIV><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 # This line is a comment.</PRE></FONT></TD></TR></TABLE></P><P>注释也可以放在于本行命令的后边. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 echo "A comment will follow." # 注释在这里. 2 # ^ 注意#前边的空白</PRE></FONT></TD></TR></TABLE></P><P>注释也可以放在本行行首<AHREF="special-chars.html#WHITESPACEREF">空白</A>的后面. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 # A tab precedes this comment.</PRE></FONT></TD></TR></TABLE></P><DIVCLASS="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>命令是不能放在同一行上注释的后边的. 因为没有办法把注释结束掉, 好让同一行上后边的<SPANCLASS="QUOTE">"代码生效"</SPAN>. 只能够另起一行来使用下一个命令. </P></TD></TR></TABLE></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>当然, 在<BCLASS="COMMAND">echo</B>中转义的<SPANCLASS="TOKEN">#</SPAN>是<EM>不能</EM>作为注释的. 同样的, <SPANCLASS="TOKEN">#</SPAN>也可以出现在<AHREF="parameter-substitution.html#PSUB2">特定的参数替换结构</A>中, 或者是出现在<AHREF="numerical-constants.html#NUMCONSTANTS">数字常量表达式</A>中. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 echo "The # here does not begin a comment." 2 echo 'The # here does not begin a comment.' 3 echo The \# here does not begin a comment. 4 echo The # 这里开始一个注释. 5 6 echo ${PATH#*:} # 参数替换, 不是一个注释. 7 echo $(( 2#101011 )) # 数制转换, 不是一个注释. 8 9 # 感谢, S.C.</PRE></FONT></TD></TR></TABLE> 标准的<AHREF="quoting.html#QUOTINGREF">引用和转义</A>字符(" ' \)可以用来转义#. </P></TD></TR></TABLE></DIV><P>某些特定的<AHREF="parameter-substitution.html#PSOREX1">模式匹配操作</A>也可以使用<SPANCLASS="TOKEN">#</SPAN>.</P></DD><DT><SPANCLASS="TOKEN">;</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>命令分隔符[分号, 即;]. </B>可以在同一行上写两个或两个以上的命令. </P></DIV><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 echo hello; echo there 2 3 4 if [ -x "$filename" ]; then # 注意: "if"和"then"需要分隔. 5 # 为什么? 6 echo "File $filename exists."; cp $filename $filename.bak 7 else 8 echo "File $filename not found."; touch $filename 9 fi; echo "File test complete."</PRE></FONT></TD></TR></TABLE></P><P>注意一下<SPANCLASS="QUOTE">"<SPANCLASS="TOKEN">;</SPAN>"</SPAN>某些情况下需要<AHREF="escapingsection.html#ESCP">转义</A>.</P></DD><DT><SPANCLASS="TOKEN">;;</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>终止<AHREF="testbranch.html#CASEESAC1">case</A>选项[双分号, 即;;]. </B><ANAME="DOUBLESEMICOLON"></A></P></DIV><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 case "$variable" in 2 abc) echo "\$variable = abc" ;; 3 xyz) echo "\$variable = xyz" ;; 4 esac</PRE></FONT></TD></TR></TABLE></P></DD><DT><SPANCLASS="TOKEN">.</SPAN></DT><DD><P><ANAME="DOTREF"></A></P><DIVCLASS="FORMALPARA"><P><B><SPANCLASS="QUOTE">"点"</SPAN>命令[句点, 即.]. </B>等价于<AHREF="internal.html#SOURCEREF">source</A>命令(参见 <AHREF="internal.html#EX38">例子 11-21</A>). 这是一个bash的<AHREF="internal.html#BUILTINREF">内建命令</A>.</P></DIV></DD><DT><SPANCLASS="TOKEN">.</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><SPANCLASS="QUOTE">"点"</SPAN>作为文件名的一部分. </B>如果点放在文件名的开头的话, 那么这个文件将会成为<SPANCLASS="QUOTE">"隐藏"</SPAN>文件, 并且<AHREF="basic.html#LSREF">ls</A>命令将不会正常的显示出这个文件. <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">touch .hidden-file</KBD><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">ls -l</KBD> <SAMPCLASS="COMPUTEROUTPUT">total 10 -rw-r--r-- 1 bozo 4034 Jul 18 22:04 data1.addressbook -rw-r--r-- 1 bozo 4602 May 25 13:58 data1.addressbook.bak -rw-r--r-- 1 bozo 877 Dec 17 2000 employment.addressbook</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">ls -al</KBD> <SAMPCLASS="COMPUTEROUTPUT">total 14 drwxrwxr-x 2 bozo bozo 1024 Aug 29 20:54 ./ drwx------ 52 bozo bozo 3072 Aug 29 20:51 ../ -rw-r--r-- 1 bozo bozo 4034 Jul 18 22:04 data1.addressbook -rw-r--r-- 1 bozo bozo 4602 May 25 13:58 data1.addressbook.bak -rw-r--r-- 1 bozo bozo 877 Dec 17 2000 employment.addressbook -rw-rw-r-- 1 bozo bozo 0 Aug 29 20:54 .hidden-file</SAMP> </PRE></FONT></TD></TR></TABLE> </P></DIV><P>如果作为目录名的话, <EM>一个单独的点</EM>代表当前的工作目录, 而<EM>两个点</EM>表示上一级目录. </P><P> <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">pwd</KBD><SAMPCLASS="COMPUTEROUTPUT">/home/bozo/projects</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">cd .</KBD><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">pwd</KBD><SAMPCLASS="COMPUTEROUTPUT">/home/bozo/projects</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">cd ..</KBD><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">pwd</KBD><SAMPCLASS="COMPUTEROUTPUT">/home/bozo/</SAMP> </PRE></FONT></TD></TR></TABLE> </P><P><EM>点</EM>经常会出现在文件移动命令的目的参数(目录)的位置上. </P><P> <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">cp /home/bozo/current_work/junk/* .</KBD> </PRE></FONT></TD></TR></TABLE> </P></DD><DT><SPANCLASS="TOKEN">.</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><SPANCLASS="QUOTE">"点"</SPAN>字符匹配. </B>当用作<AHREF="x13673.html#REGEXDOT">匹配字符</A>的作用时, 通常都是作为<AHREF="regexp.html#REGEXREF">正则表达式</A>的一部分来使用, <SPANCLASS="QUOTE">"点"</SPAN>用来匹配任何的单个字符. </P></DIV></DD><DT><SPANCLASS="TOKEN">"</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><AHREF="varsubn.html#DBLQUO">部分引用</A>[双引号, 即"]. </B><EM>"STRING"</EM>将会阻止(解释)<EM>STRING</EM>中大部分特殊的字符. 参见<AHREF="quoting.html"> 5</A>.</P></DIV></DD><DT><SPANCLASS="TOKEN">'</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><AHREF="varsubn.html#SNGLQUO">全引用</A>[单引号, 即']. </B><EM>'STRING'</EM>将会阻止<EM>STRING</EM>中所有特殊字符的解释. 这是一种比使用<SPANCLASS="TOKEN">"</SPAN>更强烈的形式. 参见<AHREF="quoting.html"> 5</A>.</P></DIV></DD><DT><SPANCLASS="TOKEN">,</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><AHREF="ops.html#COMMAOP">逗号操作符</A>. </B><BCLASS="COMMAND">逗号操作符</B>链接了一系列的算术操作. 虽然里边所有的内容都被运行了,但只有最后一项被返回. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 let "t2 = ((a = 9, 15 / 3))" # Set "a = 9" and "t2 = 15 / 3"</PRE></FONT></TD></TR></TABLE> </P></DIV></DD><DT><SPANCLASS="TOKEN">\</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><AHREF="escapingsection.html#ESCP">转义符</A>[反斜线, 即\]. </B>一种对单字符的引用机制. </P></DIV><P><KBDCLASS="USERINPUT">\X</KBD>将会<SPANCLASS="QUOTE">"转义"</SPAN>字符<EM>X</EM>. 这等价于<EM><SPANCLASS="QUOTE">"X"</SPAN></EM>, 也等价于<EM>'X'</EM>. <SPANCLASS="TOKEN">\</SPAN>通常用来转义<SPANCLASS="TOKEN">"</SPAN>和<SPANCLASS="TOKEN">'</SPAN>, 这样双引号和但引号就不会被解释成特殊含义了. </P><P>参见<AHREF="quoting.html"> 5</A>来深入地了解转义符的详细解释. </P></DD><DT><SPANCLASS="TOKEN">/</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>文件名路径分隔符[斜线, 即/]. </B>分隔文件名不同的部分(比如 <TTCLASS="FILENAME">/home/bozo/projects/Makefile</TT>). </P></DIV><P>也可以用来作为除法<AHREF="ops.html#AROPS1">算术操作符</A>. </P></DD><DT><SPANCLASS="TOKEN">`</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><AHREF="commandsub.html#COMMANDSUBREF">命令替换</A>. </B><BCLASS="COMMAND">`command`</B>结构可以将<BCLASS="COMMAND">命令</B>的输出赋值到一个变量中去. 我们在后边的<AHREF="commandsub.html#BACKQUOTESREF">后置引用(backquotes)</A>或后置标记(backticks)中也会讲解. </P></DIV></DD><DT><SPANCLASS="TOKEN">:</SPAN></DT><DD><P><ANAME="NULLREF"></A></P><DIVCLASS="FORMALPARA"><P><B>空命令[冒号, 即:]. </B>等价于<SPANCLASS="QUOTE">"NOP"</SPAN> (<TTCLASS="REPLACEABLE"><I>no op</I></TT>, 一个什么也不干的命令). 也可以被认为与shell的内建命令<AHREF="internal.html#TRUEREF">true</A>作用相同. <SPANCLASS="QUOTE">"<SPANCLASS="TOKEN">:</SPAN>"</SPAN>命令是一个bash的<AHREF="internal.html#BUILTINREF">内建命令</A>, 它的<AHREF="exit-status.html#EXITSTATUSREF">退出码(exit status)</A>是<SPANCLASS="QUOTE">"true"</SPAN>(<SPAN
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?