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 #include <stdio.h> 2 3 /* "Hello, world." C program */ 4 5 int main() 6 { 7 printf( "Hello, world." ); 8 return (0); 9 }</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 #!/bin/bash 2 # hello.sh 3 4 greeting=`./hello` 5 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 output=$(sed -n /"$1"/p $file) # 来自于例子"grp.sh". 2 3 # 将文本文件的内容保存到一个变量中. 4 File_contents1=$(cat $file1) 5 File_contents2=$(<$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 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 #!/bin/bash 2 # agram2.sh 3 # 关于命令替换嵌套的例子. 4 5 # 使用"anagram"工具. 6 #+ 这是作者的"yawl"文字表软件包中的一部分. 7 # http://ibiblio.org/pub/Linux/libs/yawl-0.3.2.tar.gz 8 # http://personal.riverusers.com/~thegrendel/yawl-0.3.2.tar.gz 9 10 E_NOARGS=66 11 E_BADARG=67 12 MINLEN=7 13 14 if [ -z "$1" ] 15 then 16 echo "Usage $0 LETTERSET" 17 exit $E_NOARGS # 脚本需要一个命令行参数. 18 elif [ ${#1} -lt $MINLEN ] 19 then 20 echo "Argument must have at least $MINLEN letters." 21 exit $E_BADARG 22 fi 23 24 25 26 FILTER='.......' # 必须至少有7个字符. 27 # 1234567 28 Anagrams=( $(echo $(anagram $1 | grep $FILTER) ) ) 29 # | | 嵌套的命令替换. | | 30 # ( 数组分配 ) 31 32 echo 33 echo "${#Anagrams[*]} 7+ letter anagrams found" 34 echo 35 echo ${Anagrams[0]} # 第一个anagram. 36 echo ${Anagrams[1]} # 第二个anagram. 37 # 等等. 38 39 # echo "${Anagrams[*]}" # 在一行上列出所有的anagram . . . 40 41 # 考虑到后边还有单独的一章, 对"数组"进行详细的讲解, 42 #+ 所以在这里就不深入讨论了. 43 44 # 可以参考脚本agram.sh, 这也是一个找出anagram的例子. 45 46 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 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 + -
显示快捷键?