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 a=123 2 { a=321; } 3 echo "a = $a" # a = 321 (说明在代码块中对变量a所作的修改, 影响了外边的变量) 4 5 # 感谢, 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 #!/bin/bash 2 # 从/etc/fstab中读行. 3 4 File=/etc/fstab 5 6 { 7 read line1 8 read line2 9 } < $File 10 11 echo "First line in $File is:" 12 echo "$line1" 13 echo 14 echo "Second line in $File is:" 15 echo "$line2" 16 17 exit 0 18 19 # 现在, 你怎么分析每行的分割域? 20 # 小提示: 使用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 #!/bin/bash 2 # rpm-check.sh 3 4 # 这个脚本的目的是为了描述, 列表, 和确定是否可以安装一个rpm包. 5 # 在一个文件中保存输出. 6 # 7 # 这个脚本使用一个代码块来展示. 8 9 SUCCESS=0 10 E_NOARGS=65 11 12 if [ -z "$1" ] 13 then 14 echo "Usage: `basename $0` rpm-file" 15 exit $E_NOARGS 16 fi 17 18 { 19 echo 20 echo "Archive Description:" 21 rpm -qpi $1 # 查询说明. 22 echo 23 echo "Archive Listing:" 24 rpm -qpl $1 # 查询列表. 25 echo 26 rpm -i --test $1 # 查询rpm包是否可以被安装. 27 if [ "$?" -eq $SUCCESS ] 28 then 29 echo "$1 can be installed." 30 else 31 echo "$1 cannot be installed." 32 fi 33 echo 34 } > "$1.test" # 把代码块中的所有输出都重定向到文件中. 35 36 echo "Results of rpm test in file $1.test" 37 38 # 查看rpm的man页来查看rpm的选项. 39 40 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 Array[1]=slot_1 2 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">></SPAN> <SPANCLASS="TOKEN">&></SPAN> <SPANCLASS="TOKEN">>&</SPAN> <SPANCLASS="TOKEN">>></SPAN> <SPANCLASS="TOKEN"><</SPAN> <SPANCLASS="TOKEN"><></SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B><AHREF="io-redirection.html#IOREDIRREF">重定向</A>. </B></P></DIV><P> <KBDCLASS="USERINPUT">scriptname >filename</KBD> 重定向<TTCLASS="FILENAME">scriptname</TT>的输出到文件<TTCLASS="FILENAME">filename</TT>中. 如果<TTCLASS="FILENAME">filename</TT>存在的话, 那么将会被覆盖. </P><P> <KBDCLASS="USERINPUT">command &>filename</KBD> 重定向<TTCLASS="FILENAME">command</TT>的<TTCLASS="FILENAME">stdout</TT>和<TTCLASS="FILENAME">stderr</TT>到<TTCLASS="FILENAME">filename</TT>中. </P><P><KBDCLASS="USERINPUT">command >&2</KBD> 重定向<TTCLASS="FILENAME">command</TT>的<TTCLASS="FILENAME">stdout</TT>到<TTCLASS="FILENAME">stderr</TT>中. </P><P><KBDCLASS="USERINPUT">scriptname >>filename</KBD> 把<TTCLASS="FILENAME">scriptname</TT>的输出追加到文件<TTCLASS="FILENAME">filename</TT>中. 如果<TTCLASS="FILENAME">filename</TT>不存在的话, 将会被创建. </P><P><KBDCLASS="USERINPUT">[i]<>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)></KBD></P><P><KBDCLASS="USERINPUT"><(command)</KBD></P><P><AHREF="comparison-ops.html#LTREF">在一种不同的上下文中</A>, <SPANCLASS="QUOTE">"<SPANCLASS="TOKEN"><</SPAN>"</SPAN>和<SPANCLASS="QUOTE">"<SPANCLASS="TOKEN">></SPAN>"</SPAN>可用来做 <AHREF="comparison-ops.html#SCOMPARISON1">字符串比较操作</A>. </P><P><AHREF="comparison-ops.html#INTLT">在另一种上下文中</A>, <SPANCLASS="QUOTE">"<SPANCLASS="TOKEN"><</SPAN>"</SPAN>和<SPANCLASS="QUOTE">"<SPANCLASS="TOKEN">></SPAN>"</SPAN>可用来做 <AHREF="comparison-ops.html#ICOMPARISON1">整数比较操作</A>. 参见<AHREF="moreadv.html#EX45">例子 12-9</A>. </P></DD><DT><SPANCLASS="TOKEN"><<</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>用在<AHREF="here-docs.html#HEREDOCREF">here document</A>中的重定向. </B></P></DIV></DD><DT><SPANCLASS="TOKEN"><<<</SPAN></DT><DD><DIVCLASS="FORMALPARA"><P><B>用在<AHREF="x13628.html#HERESTRINGSREF">here string</A>中的重定向. </B></P></DIV></DD><DT><SPANCLASS="TOKEN"><</SPAN>, <SPANCLASS="TOKEN">></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 veg1=carrots 2 veg2=tomatoes 3 4 if [[ "$veg1" < "$veg2" ]] 5 then 6 echo "Although $veg1 precede $veg2 in the dictionary," 7 echo "this implies nothing about my culinary preferences." 8 else 9 echo "What kind of dictionary are you using, anyhow?" 10 fi</PRE></FONT></TD></TR></TABLE></P></DIV></DD><DT><SPANCLASS="TOKEN">\<</SPAN>, <SPANCLASS="TOKEN">\></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 '\<the\>' 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 echo ls -l | sh 2 # 传递"echo ls -l"的输出到shell中, 3 #+ 与一个简单的"ls -l"结果相同. 4 5 6 cat *.lst | sort | uniq 7 # 合并和排序所有的".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 + -
显示快捷键?