parameter-substitution.html
来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 1,567 行 · 第 1/3 页
HTML
1,567 行
29 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 #!/bin/bash 2 3 var1=abcd-1234-defg 4 echo "var1 = $var1" 5 6 t=${var1#*-*} 7 echo "var1 (with everything, up to and including first - stripped out) = $t" 8 # t=${var1#*-} 也一样, 9 #+ 因为#匹配最短的字符串, 10 #+ 同时*匹配任意前缀, 包括空字符串. 11 # (感谢, Stephane Chazelas, 指出这点.) 12 13 t=${var1##*-*} 14 echo "If var1 contains a \"-\", returns empty string... var1 = $t" 15 16 17 t=${var1%*-*} 18 echo "var1 (with everything from the last - on stripped out) = $t" 19 20 echo 21 22 # ------------------------------------------- 23 path_name=/home/bozo/ideas/thoughts.for.today 24 # ------------------------------------------- 25 echo "path_name = $path_name" 26 t=${path_name##/*/} 27 echo "path_name, stripped of prefixes = $t" 28 # 在这个特例中, 与 t=`basename $path_name` 效果相同. 29 # t=${path_name%/}; t=${t##*/} 是更一般的解决方法. 30 #+ 但有时还是会失败. 31 # 如果$path_name以一个换行符结尾的话, 那么 `basename $path_name` 就不能正常工作了, 32 #+ 但是上边的表达式可以. 33 # (感谢, S.C.) 34 35 t=${path_name%/*.*} 36 # 与 t=`dirname $path_name` 效果相同. 37 echo "path_name, stripped of suffixes = $t" 38 # 在某些情况下将失效, 比如 "../", "/foo////", # "foo/", "/". 39 # 删除后缀, 尤其是在basename没有后缀的情况下, 40 #+ 但是dirname可以, 不过这同时也使问题复杂化了. 41 # (感谢, S.C.) 42 43 echo 44 45 t=${path_name:11} 46 echo "$path_name, with first 11 chars stripped off = $t" 47 t=${path_name:11:5} 48 echo "$path_name, with first 11 chars stripped off, length 5 = $t" 49 50 echo 51 52 t=${path_name/bozo/clown} 53 echo "$path_name with \"bozo\" replaced by \"clown\" = $t" 54 t=${path_name/today/} 55 echo "$path_name with \"today\" deleted = $t" 56 t=${path_name//o/O} 57 echo "$path_name with all o's capitalized = $t" 58 t=${path_name//o/} 59 echo "$path_name with all o's deleted = $t" 60 61 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 #!/bin/bash 2 # var-match.sh: 3 # 对字符串的前缀和后缀进行模式替换的一个演示. 4 5 v0=abc1234zip1234abc # 变量原始值. 6 echo "v0 = $v0" # abc1234zip1234abc 7 echo 8 9 # 匹配字符串的前缀(开头). 10 v1=${v0/#abc/ABCDEF} # abc1234zip1234abc 11 # |-| 12 echo "v1 = $v1" # ABCDEF1234zip1234abc 13 # |----| 14 15 # 匹配字符串的后缀(结尾). 16 v2=${v0/%abc/ABCDEF} # abc1234zip123abc 17 # |-| 18 echo "v2 = $v2" # abc1234zip1234ABCDEF 19 # |----| 20 21 echo 22 23 # ---------------------------------------------------- 24 # 必须匹配字符串的开头或结尾, 25 #+ 否则是不会产生替换结果的. 26 # ---------------------------------------------------- 27 v3=${v0/#123/000} # 匹配, 但不是在开头. 28 echo "v3 = $v3" # abc1234zip1234abc 29 # 不会发生替换. 30 v4=${v0/%123/000} # 匹配, 但不是在结尾. 31 echo "v4 = $v4" # abc1234zip1234abc 32 # 不会发生替换. 33 34 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 xyz23=whatever 2 xyz24= 3 4 a=${!xyz*} # 展开所有以"xyz"开头的, 并且之前声明过的变量名. 5 echo "a = $a" # a = xyz23 xyz24 6 a=${!xyz@} # 同上. 7 echo "a = $a" # a = xyz23 xyz24 8 9 # 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 + -
显示快捷键?