commandsub.html

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

HTML
1,239
字号
><P>命令替换使得扩展有效Bash工具集变为可能		这样, 写一段小程序或者一段脚本就可以达到目的. 		因为程序或脚本的输出会传到<TTCLASS="FILENAME">stdout</TT>上(就像一个标准UNIX工具所做的那样), 		然后重新将这些输出保存到变量中. 		(译者: 作者的意思就是在这种情况下写脚本和写程序作用是一样的.)</P><P>		<TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#include &#60;stdio.h&#62;  2&nbsp;  3&nbsp;/*  "Hello, world." C program  */		  4&nbsp;  5&nbsp;int main()  6&nbsp;{  7&nbsp;  printf( "Hello, world." );  8&nbsp;  return (0);  9&nbsp;}</PRE></FONT></TD></TR></TABLE>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">gcc -o hello hello.c</KBD>	      </PRE></FONT></TD></TR></TABLE>		</P><P>                <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# hello.sh		  3&nbsp;  4&nbsp;greeting=`./hello`  5&nbsp;echo $greeting</PRE></FONT></TD></TR></TABLE>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">sh hello.sh</KBD><SAMPCLASS="COMPUTEROUTPUT">Hello, world.</SAMP>	        </PRE></FONT></TD></TR></TABLE>	        </P><P></P></DIV></TD></TR></TABLE><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="100%"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">$(COMMAND)</B>形式已经取代了后置引用"`". 			</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;output=$(sed -n /"$1"/p $file)   # 来自于例子"grp.sh".   2&nbsp;	        3&nbsp;# 将文本文件的内容保存到一个变量中.   4&nbsp;File_contents1=$(cat $file1)        5&nbsp;File_contents2=$(&#60;$file2)        # Bash也允许这么做. </PRE></FONT></TD></TR></TABLE></P><P><BCLASS="COMMAND">$(...)</B>形式的命令替换在处理双反斜线(\\)时与<BCLASS="COMMAND">`...`</B>形式不同. </P><P>			      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo `echo \\`</KBD><SAMPCLASS="COMPUTEROUTPUT"></SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $(echo \\)</KBD><SAMPCLASS="COMPUTEROUTPUT">\</SAMP>	      </PRE></FONT></TD></TR></TABLE>              </P><P><BCLASS="COMMAND">$(...)</B>形式的命令替换是允许嵌套的. 		  <ANAME="AEN13182"HREF="#FTN.AEN13182"><SPANCLASS="footnote">[3]</SPAN></A>				</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;word_count=$( wc -w $(ls -l | awk '{print $9}') )</PRE></FONT></TD></TR></TABLE>              </P><P>或者, 可以更加灵活 . . .</P><DIVCLASS="EXAMPLE"><HR><ANAME="AGRAM2"></A><P><B>例子 14-3. 找anagram(回文构词法, 可以将一个有意义的单词, 			  变换为1个或多个有意义的单词, 但是还是原来的子母集合)</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# agram2.sh  3&nbsp;# 关于命令替换嵌套的例子.   4&nbsp;  5&nbsp;#  使用"anagram"工具.   6&nbsp;#+ 这是作者的"yawl"文字表软件包中的一部分.   7&nbsp;#  http://ibiblio.org/pub/Linux/libs/yawl-0.3.2.tar.gz  8&nbsp;#  http://personal.riverusers.com/~thegrendel/yawl-0.3.2.tar.gz  9&nbsp; 10&nbsp;E_NOARGS=66 11&nbsp;E_BADARG=67 12&nbsp;MINLEN=7 13&nbsp; 14&nbsp;if [ -z "$1" ] 15&nbsp;then 16&nbsp;  echo "Usage $0 LETTERSET" 17&nbsp;  exit $E_NOARGS         # 脚本需要一个命令行参数.  18&nbsp;elif [ ${#1} -lt $MINLEN ] 19&nbsp;then 20&nbsp;  echo "Argument must have at least $MINLEN letters." 21&nbsp;  exit $E_BADARG 22&nbsp;fi 23&nbsp; 24&nbsp; 25&nbsp; 26&nbsp;FILTER='.......'         # 必须至少有7个字符.  27&nbsp;#       1234567 28&nbsp;Anagrams=( $(echo $(anagram $1 | grep $FILTER) ) ) 29&nbsp;#           |     |    嵌套的命令替换.       | | 30&nbsp;#        (              数组分配                 ) 31&nbsp; 32&nbsp;echo 33&nbsp;echo "${#Anagrams[*]}  7+ letter anagrams found" 34&nbsp;echo 35&nbsp;echo ${Anagrams[0]}      # 第一个anagram.  36&nbsp;echo ${Anagrams[1]}      # 第二个anagram.  37&nbsp;                         # 等等.  38&nbsp; 39&nbsp;# echo "${Anagrams[*]}"  # 在一行上列出所有的anagram . . . 40&nbsp; 41&nbsp;#  考虑到后边还有单独的一章, 对"数组"进行详细的讲解,  42&nbsp;#+ 所以在这里就不深入讨论了.  43&nbsp; 44&nbsp;# 可以参考脚本agram.sh, 这也是一个找出anagram的例子.  45&nbsp; 46&nbsp;exit $?</PRE></FONT></TD></TR></TABLE><HR></DIV></TD></TR></TABLE></DIV><P>命令替换在脚本中使用的例子:        <P></P><OLTYPE="1"><LI><P><AHREF="loops1.html#BINGREP">例子 10-7</A></P></LI><LI><P><AHREF="testbranch.html#CASECMD">例子 10-26</A></P></LI><LI><P><AHREF="randomvar.html#SEEDINGRANDOM">例子 9-29</A></P></LI><LI><P><AHREF="moreadv.html#EX57">例子 12-3</A></P></LI><LI><P><AHREF="textproc.html#LOWERCASE">例子 12-19</A></P></LI><LI><P><AHREF="textproc.html#GRP">例子 12-15</A></P></LI><LI><P><AHREF="extmisc.html#EX53">例子 12-49</A></P></LI><LI><P><AHREF="loops1.html#EX24">例子 10-13</A></P></LI><LI><P><AHREF="loops1.html#SYMLINKS">例子 10-10</A></P></LI><LI><P><AHREF="filearchiv.html#STRIPC">例子 12-29</A></P></LI><LI><P><AHREF="redircb.html#REDIR4">例子 16-8</A></P></LI><LI><P><AHREF="contributed-scripts.html#TREE">例子 A-17</A></P></LI><LI><P><AHREF="procref1.html#PIDID">例子 27-2</A></P></LI><LI><P><AHREF="mathc.html#MONTHLYPMT">例子 12-42</A></P></LI><LI><P><AHREF="mathc.html#BASE">例子 12-43</A></P></LI><LI><P><AHREF="mathc.html#ALTBC">例子 12-44</A></P></LI></OL>     </P></DIV><H3CLASS="FOOTNOTES">注意事项</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN13093"HREF="commandsub.html#AEN13093"><SPANCLASS="footnote">[1]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>对于<EM>命令替换</EM>来说, 		这个<BCLASS="COMMAND">命令</B>既可以是外部的系统命令, 		也可以是内部脚本的<EM>内建命令</EM>, 		甚至可以是<AHREF="assortedtips.html#RVT">脚本函数</A>. </P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN13099"HREF="commandsub.html#AEN13099"><SPANCLASS="footnote">[2]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>从技术的角度来讲, 		<EM>命令替换</EM>将会抽取一个命令的输出, 		然后使用<SPANCLASS="TOKEN">=</SPAN>操作将其赋值到一个变量中. 		</P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN13182"HREF="commandsub.html#AEN13182"><SPANCLASS="footnote">[3]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>				事实上, 对于后置引用的嵌套是可行的, 				但是只能将内部的反引号转义才行, 				就像John默认指出的那样. 		      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;word_count=` wc -w \`ls -l | awk '{print $9}'\` `</PRE></FONT></TD></TR></TABLE>		    </P></TD></TR></TABLE><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="sysscripts.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首页</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="arithexp.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">分析一个系统脚本</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="part3.html"ACCESSKEY="U">上一级</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">算术扩展</TD></TR></TABLE></DIV></BODY></HTML>

⌨️ 快捷键说明

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