📄 parameter-substitution.html
字号:
>${var##Pattern}</B></TT></DT><DD><P>Remove from <TTCLASS="VARNAME">$var</TT> the shortest/longest part of <TTCLASS="VARNAME">$Pattern</TT> that matches the <TTCLASS="REPLACEABLE"><I>front end</I></TT> of <TTCLASS="VARNAME">$var</TT>. </P><P>A usage illustration from <AHREF="contributed-scripts.html#DAYSBETWEEN">Example A-7</A>:<TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 # Function from "days-between.sh" example. 2 # Strips leading zero(s) from argument passed. 3 4 strip_leading_zero () # Strip possible leading zero(s) 5 { #+ from argument passed. 6 return=${1#0} # The "1" refers to "$1" -- passed arg. 7 } # The "0" is what to remove from "$1" -- strips zeros.</PRE></TD></TR></TABLE> </P><P>Manfred Schwarb's more elaborate variation of the above:<TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 strip_leading_zero2 () # Strip possible leading zero(s), since otherwise 2 { # Bash will interpret such numbers as octal values. 3 shopt -s extglob # Turn on extended globbing. 4 local val=${1##+(0)} # Use local variable, longest matching series of 0's. 5 shopt -u extglob # Turn off extended globbing. 6 _strip_leading_zero2=${val:-0} 7 # If input was 0, return 0 instead of "". 8 }</PRE></TD></TR></TABLE> </P><P>Another usage illustration: <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 echo `basename $PWD` # Basename of current working directory. 2 echo "${PWD##*/}" # Basename of current working directory. 3 echo 4 echo `basename $0` # Name of script. 5 echo $0 # Name of script. 6 echo "${0##*/}" # Name of script. 7 echo 8 filename=test.data 9 echo "${filename##*.}" # data 10 # Extension of filename.</PRE></TD></TR></TABLE> </P></DD><DT><ANAME="PCTPATREF"></A><TTCLASS="USERINPUT"><B>${var%Pattern}</B></TT>, <TTCLASS="USERINPUT"><B>${var%%Pattern}</B></TT></DT><DD><P>Remove from <TTCLASS="VARNAME">$var</TT> the shortest/longest part of <TTCLASS="VARNAME">$Pattern</TT> that matches the <TTCLASS="REPLACEABLE"><I>back end</I></TT> of <TTCLASS="VARNAME">$var</TT>. </P></DD></DL></DIV><P><AHREF="bash2.html#BASH2REF">Version 2</A> of Bash added additional options.</P><DIVCLASS="EXAMPLE"><HR><ANAME="PATTMATCHING"></A><P><B>Example 9-17. Pattern matching in parameter substitution</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # patt-matching.sh 3 4 # Pattern matching using the # ## % %% parameter substitution operators. 5 6 var1=abcd12345abc6789 7 pattern1=a*c # * (wild card) matches everything between a - c. 8 9 echo 10 echo "var1 = $var1" # abcd12345abc6789 11 echo "var1 = ${var1}" # abcd12345abc6789 12 # (alternate form) 13 echo "Number of characters in ${var1} = ${#var1}" 14 echo 15 16 echo "pattern1 = $pattern1" # a*c (everything between 'a' and 'c') 17 echo "--------------" 18 echo '${var1#$pattern1} =' "${var1#$pattern1}" # d12345abc6789 19 # Shortest possible match, strips out first 3 characters abcd12345abc6789 20 # ^^^^^ |-| 21 echo '${var1##$pattern1} =' "${var1##$pattern1}" # 6789 22 # Longest possible match, strips out first 12 characters abcd12345abc6789 23 # ^^^^^ |----------| 24 25 echo; echo; echo 26 27 pattern2=b*9 # everything between 'b' and '9' 28 echo "var1 = $var1" # Still abcd12345abc6789 29 echo 30 echo "pattern2 = $pattern2" 31 echo "--------------" 32 echo '${var1%pattern2} =' "${var1%$pattern2}" # abcd12345a 33 # Shortest possible match, strips out last 6 characters abcd12345abc6789 34 # ^^^^ |----| 35 echo '${var1%%pattern2} =' "${var1%%$pattern2}" # a 36 # Longest possible match, strips out last 12 characters abcd12345abc6789 37 # ^^^^ |-------------| 38 39 # Remember, # and ## work from the left end (beginning) of string, 40 # % and %% work from the right end. 41 42 echo 43 44 exit 0</PRE></TD></TR></TABLE><HR></DIV><DIVCLASS="EXAMPLE"><HR><ANAME="RFE"></A><P><B>Example 9-18. Renaming file extensions<SPANCLASS="TOKEN">:</SPAN></B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # rfe.sh: Renaming file extensions. 3 # 4 # rfe old_extension new_extension 5 # 6 # Example: 7 # To rename all *.gif files in working directory to *.jpg, 8 # rfe gif jpg 9 10 11 E_BADARGS=65 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="EMPHASIS">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 <ICLASS="EMPHASIS">nothing</I>, that is, deleted.</P></DD><DT><TTCLASS="USERINPUT"><B>${var//Pattern/Replacement}</B></TT></DT><DD><DIVCLASS="FORMALPARA"><P><B>Global replacement. </B>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 <ICLASS="EMPHASIS">nothing</I>, that is, deleted.</P><DIVCLASS="EXAMPLE"><HR><ANAME="EX7"></A><P><B>Example 9-19. 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="EMPHASIS">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="EMPHASIS">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-20. 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><TTCLASS="USERINPUT"><B>${!varprefix*}</B></TT>, <TTCLASS="USERINPUT"><B>${!varprefix@}</B></TT></DT><DD><P>Matches all previously declared variables beginning with <ICLASS="EMPHASIS">varprefix</I>. <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.AEN4837"HREF="parameter-substitution.html#AEN4837">[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%"><TABLEWIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="string-manipulation.html">Prev</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html">Home</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="declareref.html">Next</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">Manipulating Strings</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="variables2.html">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 + -