parameter-substitution.html

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

HTML
1,567
字号
 29&nbsp;exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="EXPREPL1"></A>变量扩展/子串替换</B></P><DL><DT></DT><DD><P>这些结构都是从<EM>ksh</EM>中引入的.</P></DD><DT><KBDCLASS="USERINPUT">${var:pos}</KBD></DT><DD><P>变量<TTCLASS="REPLACEABLE"><I>var</I></TT>从位置<TTCLASS="REPLACEABLE"><I>pos</I></TT>开始扩展(译者注: 也就是pos之前的字符都丢弃).		  </P></DD><DT><KBDCLASS="USERINPUT">${var:pos:len}</KBD></DT><DD><P>变量<TTCLASS="REPLACEABLE"><I>var</I></TT>从位置<TTCLASS="REPLACEABLE"><I>pos</I></TT>开始, 				并扩展<TTCLASS="REPLACEABLE"><I>len</I></TT>个字符.		    参考<AHREF="contributed-scripts.html#PW">例子 A-14</A>, 这个例子展示了这种操作的一个创造性的用法. 		  </P></DD><DT><KBDCLASS="USERINPUT">${var/Pattern/Replacement}</KBD></DT><DD><P>使用<TTCLASS="REPLACEABLE"><I>Replacement</I></TT>来替换变量<TTCLASS="REPLACEABLE"><I>var</I></TT>中第一个匹配<TTCLASS="REPLACEABLE"><I>Pattern</I></TT>的字符串. 			</P><P>如果省略<TTCLASS="REPLACEABLE"><I>Replacement</I></TT>, 				那么第一个匹配<TTCLASS="REPLACEABLE"><I>Pattern</I></TT>的字符串将被替换为<EM>空</EM>, 也就是被删除了.</P></DD><DT><KBDCLASS="USERINPUT">${var//Pattern/Replacement}</KBD></DT><DD><DIVCLASS="FORMALPARA"><P><B>全局替换. </B>所有在变量<TTCLASS="REPLACEABLE"><I>var</I></TT>匹配<TTCLASS="REPLACEABLE"><I>Pattern</I></TT>的字符串,		    都会被替换为<TTCLASS="REPLACEABLE"><I>Replacement</I></TT>. </P></DIV><P>和上边一样, 如果省略<TTCLASS="REPLACEABLE"><I>Replacement</I></TT>, 				那么所有匹配<TTCLASS="REPLACEABLE"><I>Pattern</I></TT>的字符串, 			   都将被替换为<EM>空</EM>, 也就是被删除掉. </P><DIVCLASS="EXAMPLE"><HR><ANAME="EX7"></A><P><B>例子 9-20. 使用模式匹配来解析任意字符串</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;  3&nbsp;var1=abcd-1234-defg  4&nbsp;echo "var1 = $var1"  5&nbsp;  6&nbsp;t=${var1#*-*}  7&nbsp;echo "var1 (with everything, up to and including first - stripped out) = $t"  8&nbsp;#  t=${var1#*-}  也一样,  9&nbsp;#+ 因为#匹配最短的字符串, 10&nbsp;#+ 同时*匹配任意前缀, 包括空字符串.  11&nbsp;# (感谢, Stephane Chazelas, 指出这点.) 12&nbsp; 13&nbsp;t=${var1##*-*} 14&nbsp;echo "If var1 contains a \"-\", returns empty string...   var1 = $t" 15&nbsp; 16&nbsp; 17&nbsp;t=${var1%*-*} 18&nbsp;echo "var1 (with everything from the last - on stripped out) = $t" 19&nbsp; 20&nbsp;echo 21&nbsp; 22&nbsp;# ------------------------------------------- 23&nbsp;path_name=/home/bozo/ideas/thoughts.for.today 24&nbsp;# ------------------------------------------- 25&nbsp;echo "path_name = $path_name" 26&nbsp;t=${path_name##/*/} 27&nbsp;echo "path_name, stripped of prefixes = $t" 28&nbsp;# 在这个特例中, 与	t=`basename $path_name`		效果相同.  29&nbsp;#  t=${path_name%/}; t=${t##*/}   是更一般的解决方法. 30&nbsp;#+ 但有时还是会失败. 31&nbsp;#  如果$path_name以一个换行符结尾的话, 那么	`basename $path_name` 就不能正常工作了, 32&nbsp;#+ 但是上边的表达式可以. 33&nbsp;# (感谢, S.C.) 34&nbsp; 35&nbsp;t=${path_name%/*.*} 36&nbsp;# 与	t=`dirname $path_name`	效果相同. 37&nbsp;echo "path_name, stripped of suffixes = $t" 38&nbsp;# 在某些情况下将失效, 比如 "../", "/foo////", # "foo/", "/". 39&nbsp;#  删除后缀, 尤其是在basename没有后缀的情况下, 40&nbsp;#+ 但是dirname可以, 不过这同时也使问题复杂化了. 41&nbsp;# (感谢, S.C.) 42&nbsp; 43&nbsp;echo 44&nbsp; 45&nbsp;t=${path_name:11} 46&nbsp;echo "$path_name, with first 11 chars stripped off = $t" 47&nbsp;t=${path_name:11:5} 48&nbsp;echo "$path_name, with first 11 chars stripped off, length 5 = $t" 49&nbsp; 50&nbsp;echo 51&nbsp; 52&nbsp;t=${path_name/bozo/clown} 53&nbsp;echo "$path_name with \"bozo\" replaced  by \"clown\" = $t" 54&nbsp;t=${path_name/today/} 55&nbsp;echo "$path_name with \"today\" deleted = $t" 56&nbsp;t=${path_name//o/O} 57&nbsp;echo "$path_name with all o's capitalized = $t" 58&nbsp;t=${path_name//o/} 59&nbsp;echo "$path_name with all o's deleted = $t" 60&nbsp; 61&nbsp;exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV></DD><DT><KBDCLASS="USERINPUT">${var/#Pattern/Replacement}</KBD></DT><DD><P>如果变量<TTCLASS="REPLACEABLE"><I>var</I></TT>的<EM>前缀</EM>匹配<TTCLASS="REPLACEABLE"><I>Pattern</I></TT>, 				那么就使用<TTCLASS="REPLACEABLE"><I>Replacement</I></TT>来替换匹配到<TTCLASS="REPLACEABLE"><I>Pattern</I></TT>的字符串.</P></DD><DT><KBDCLASS="USERINPUT">${var/%Pattern/Replacement}</KBD></DT><DD><P>如果变量<TTCLASS="REPLACEABLE"><I>var</I></TT>的<EM>后缀</EM>匹配<TTCLASS="REPLACEABLE"><I>Pattern</I></TT>, 			那么就使用<TTCLASS="REPLACEABLE"><I>Replacement</I></TT>来替换匹配到<TTCLASS="REPLACEABLE"><I>Pattern</I></TT>的字符串.</P><DIVCLASS="EXAMPLE"><HR><ANAME="VARMATCH"></A><P><B>例子 9-21. 对字符串的前缀和后缀使用匹配模式</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# var-match.sh:  3&nbsp;# 对字符串的前缀和后缀进行模式替换的一个演示.  4&nbsp;  5&nbsp;v0=abc1234zip1234abc    # 变量原始值.  6&nbsp;echo "v0 = $v0"         # abc1234zip1234abc  7&nbsp;echo  8&nbsp;  9&nbsp;# 匹配字符串的前缀(开头). 10&nbsp;v1=${v0/#abc/ABCDEF}    # abc1234zip1234abc 11&nbsp;                        # |-| 12&nbsp;echo "v1 = $v1"         # ABCDEF1234zip1234abc 13&nbsp;                        # |----| 14&nbsp; 15&nbsp;# 匹配字符串的后缀(结尾). 16&nbsp;v2=${v0/%abc/ABCDEF}    # abc1234zip123abc 17&nbsp;                        #              |-| 18&nbsp;echo "v2 = $v2"         # abc1234zip1234ABCDEF 19&nbsp;                        #               |----| 20&nbsp; 21&nbsp;echo 22&nbsp; 23&nbsp;#  ---------------------------------------------------- 24&nbsp;#  必须匹配字符串的开头或结尾, 25&nbsp;#+ 否则是不会产生替换结果的. 26&nbsp;#  ---------------------------------------------------- 27&nbsp;v3=${v0/#123/000}       # 匹配, 但不是在开头. 28&nbsp;echo "v3 = $v3"         # abc1234zip1234abc 29&nbsp;                        # 不会发生替换. 30&nbsp;v4=${v0/%123/000}       # 匹配, 但不是在结尾. 31&nbsp;echo "v4 = $v4"         # abc1234zip1234abc 32&nbsp;                        # 不会发生替换.  33&nbsp; 34&nbsp;exit 0			</PRE></FONT></TD></TR></TABLE><HR></DIV></DD><DT><KBDCLASS="USERINPUT">${!varprefix*}</KBD>, <KBDCLASS="USERINPUT">${!varprefix@}</KBD></DT><DD><P>匹配所有之前声明过的, 并且以<EM>varprefix</EM>开头的变量.		      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;xyz23=whatever  2&nbsp;xyz24=  3&nbsp;  4&nbsp;a=${!xyz*}      # 展开所有以"xyz"开头的, 并且之前声明过的变量名.  5&nbsp;echo "a = $a"   # a = xyz23 xyz24  6&nbsp;a=${!xyz@}      # 同上.  7&nbsp;echo "a = $a"   # a = xyz23 xyz24  8&nbsp;  9&nbsp;# Bash, 版本2.04, 添加了这个功能.</PRE></FONT></TD></TR></TABLE>                  </P></DD></DL></DIV></DIV><H3CLASS="FOOTNOTES">注意事项</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN4933"HREF="parameter-substitution.html#AEN4933"><SPANCLASS="footnote">[1]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>如果在一个非交互脚本中, $parameter被设置为null的话, 					那么这个脚本将会返回<AHREF="exitcodes.html#EXITCODESREF"><SPANCLASS="RETURNVALUE">127</SPAN>作为退出状态码</A>(127返回码对应的Bash错误码为命令未发现<SPANCLASS="QUOTE">"command not found"</SPAN>).</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="string-manipulation.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="declareref.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">操作字符串</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="variables2.html"ACCESSKEY="U">上一级</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">指定变量的类型: 使用<BCLASS="COMMAND">declare</B>或者<BCLASS="COMMAND">typeset</B></TD></TR></TABLE></DIV></BODY></HTML>

⌨️ 快捷键说明

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