📄 parameter-substitution.html
字号:
12 13 case $# in 14 0|1) # The vertical bar means "or" in this context. 15 echo "Usage: `basename $0` old_file_suffix new_file_suffix" 16 exit $E_BADARGS # If 0 or 1 arg, then bail out. 17 ;; 18 esac 19 20 21 for filename in *.$1 22 # Traverse list of files ending with 1st argument. 23 do 24 mv $filename ${filename%$1}$2 25 # Strip off part of filename matching 1st argument, 26 #+ then append 2nd argument. 27 done 28 29 exit 0</PRE></TD></TR></TABLE><HR></DIV><DIVCLASS="VARIABLELIST"><P><B><ANAME="EXPREPL1"></A>Variable expansion / Substring replacement</B></P><DL><DT></DT><DD><P>These constructs have been adopted from <ICLASS="FIRSTTERM">ksh</I>.</P></DD><DT><TTCLASS="USERINPUT"><B>${var:pos}</B></TT></DT><DD><P>Variable <TTCLASS="REPLACEABLE"><I>var</I></TT> expanded, starting from offset <TTCLASS="REPLACEABLE"><I>pos</I></TT>. </P></DD><DT><TTCLASS="USERINPUT"><B>${var:pos:len}</B></TT></DT><DD><P>Expansion to a max of <TTCLASS="REPLACEABLE"><I>len</I></TT> characters of variable <TTCLASS="REPLACEABLE"><I>var</I></TT>, from offset <TTCLASS="REPLACEABLE"><I>pos</I></TT>. See <AHREF="contributed-scripts.html#PW">Example A-14</A> for an example of the creative use of this operator. </P></DD><DT><TTCLASS="USERINPUT"><B>${var/Pattern/Replacement}</B></TT></DT><DD><P>First match of <TTCLASS="REPLACEABLE"><I>Pattern</I></TT>, within <TTCLASS="REPLACEABLE"><I>var</I></TT> replaced with <TTCLASS="REPLACEABLE"><I>Replacement</I></TT>.</P><P>If <TTCLASS="REPLACEABLE"><I>Replacement</I></TT> is omitted, then the first match of <TTCLASS="REPLACEABLE"><I>Pattern</I></TT> is replaced by <SPANCLASS="emphasis"><ICLASS="EMPHASIS">nothing</I></SPAN>, that is, deleted.</P></DD><DT><TTCLASS="USERINPUT"><B>${var//Pattern/Replacement}</B></TT></DT><DD><DIVCLASS="FORMALPARA"><P><B>Global replacement. </B><ANAME="PSGLOB"></A> All matches of <TTCLASS="REPLACEABLE"><I>Pattern</I></TT>, within <TTCLASS="REPLACEABLE"><I>var</I></TT> replaced with <TTCLASS="REPLACEABLE"><I>Replacement</I></TT>.</P></DIV><P>As above, if <TTCLASS="REPLACEABLE"><I>Replacement</I></TT> is omitted, then all occurrences of <TTCLASS="REPLACEABLE"><I>Pattern</I></TT> are replaced by <SPANCLASS="emphasis"><ICLASS="EMPHASIS">nothing</I></SPAN>, that is, deleted.</P><DIVCLASS="EXAMPLE"><HR><ANAME="EX7"></A><P><B>Example 9-21. Using pattern matching to parse arbitrary strings</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><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#*-} works just the same, 9 #+ since # matches the shortest string, 10 #+ and * matches everything preceding, including an empty string. 11 # (Thanks, Stephane Chazelas, for pointing this out.) 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 # Same effect as t=`basename $path_name` in this particular case. 29 # t=${path_name%/}; t=${t##*/} is a more general solution, 30 #+ but still fails sometimes. 31 # If $path_name ends with a newline, then `basename $path_name` will not work, 32 #+ but the above expression will. 33 # (Thanks, S.C.) 34 35 t=${path_name%/*.*} 36 # Same effect as t=`dirname $path_name` 37 echo "path_name, stripped of suffixes = $t" 38 # These will fail in some cases, such as "../", "/foo////", # "foo/", "/". 39 # Removing suffixes, especially when the basename has no suffix, 40 #+ but the dirname does, also complicates matters. 41 # (Thanks, 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></TD></TR></TABLE><HR></DIV></DD><DT><TTCLASS="USERINPUT"><B>${var/#Pattern/Replacement}</B></TT></DT><DD><P>If <ICLASS="FIRSTTERM">prefix</I> of <TTCLASS="REPLACEABLE"><I>var</I></TT> matches <TTCLASS="REPLACEABLE"><I>Pattern</I></TT>, then substitute <TTCLASS="REPLACEABLE"><I>Replacement</I></TT> for <TTCLASS="REPLACEABLE"><I>Pattern</I></TT>.</P></DD><DT><TTCLASS="USERINPUT"><B>${var/%Pattern/Replacement}</B></TT></DT><DD><P>If <ICLASS="FIRSTTERM">suffix</I> of <TTCLASS="REPLACEABLE"><I>var</I></TT> matches <TTCLASS="REPLACEABLE"><I>Pattern</I></TT>, then substitute <TTCLASS="REPLACEABLE"><I>Replacement</I></TT> for <TTCLASS="REPLACEABLE"><I>Pattern</I></TT>.</P><DIVCLASS="EXAMPLE"><HR><ANAME="VARMATCH"></A><P><B>Example 9-22. Matching patterns at prefix or suffix of string</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # var-match.sh: 3 # Demo of pattern replacement at prefix / suffix of string. 4 5 v0=abc1234zip1234abc # Original variable. 6 echo "v0 = $v0" # abc1234zip1234abc 7 echo 8 9 # Match at prefix (beginning) of string. 10 v1=${v0/#abc/ABCDEF} # abc1234zip1234abc 11 # |-| 12 echo "v1 = $v1" # ABCDEF1234zip1234abc 13 # |----| 14 15 # Match at suffix (end) of string. 16 v2=${v0/%abc/ABCDEF} # abc1234zip123abc 17 # |-| 18 echo "v2 = $v2" # abc1234zip1234ABCDEF 19 # |----| 20 21 echo 22 23 # ---------------------------------------------------- 24 # Must match at beginning / end of string, 25 #+ otherwise no replacement results. 26 # ---------------------------------------------------- 27 v3=${v0/#123/000} # Matches, but not at beginning. 28 echo "v3 = $v3" # abc1234zip1234abc 29 # NO REPLACEMENT. 30 v4=${v0/%123/000} # Matches, but not at end. 31 echo "v4 = $v4" # abc1234zip1234abc 32 # NO REPLACEMENT. 33 34 exit 0 </PRE></TD></TR></TABLE><HR></DIV></DD><DT><ANAME="VARPREFIXM"></A><TTCLASS="USERINPUT"><B>${!varprefix*}</B></TT>, <TTCLASS="USERINPUT"><B>${!varprefix@}</B></TT></DT><DD><P>Matches <SPANCLASS="emphasis"><ICLASS="EMPHASIS">names</I></SPAN> of all previously declared variables beginning with <TTCLASS="PARAMETER"><I>varprefix</I></TT>. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 xyz23=whatever 2 xyz24= 3 4 a=${!xyz*} # Expands to *names* of declared variables beginning with "xyz". 5 echo "a = $a" # a = xyz23 xyz24 6 a=${!xyz@} # Same as above. 7 echo "a = $a" # a = xyz23 xyz24 8 9 # Bash, version 2.04, adds this feature.</PRE></TD></TR></TABLE> </P></DD></DL></DIV></DIV><H3CLASS="FOOTNOTES">Notes</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN5317"HREF="parameter-substitution.html#AEN5317">[1]</A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>If $parameter is null in a non-interactive script, it will terminate with a <AHREF="exitcodes.html#EXITCODESREF"><SPANCLASS="RETURNVALUE">127</SPAN> exit status</A> (the Bash error code for <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">Prev</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">Home</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="declareref.html"ACCESSKEY="N">Next</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">Manipulating Strings</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="variables2.html"ACCESSKEY="U">Up</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">Typing variables: <BCLASS="COMMAND">declare</B> or <BCLASS="COMMAND">typeset</B></TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -