bash变量的删除与替换

一、变量的删除

使用#和%

#为从前往后检索子串进行删除

${string#substring} 
从变量$string开头开始删除最短匹配$substring子串

${string##substring} 
从变量$string开头开始删除最长匹配$substring子串

thorking@thorking:~$ usr=thorThorKing01king
thorking@thorking:~$ echo ${usr#thor}
ThorKing01king
thorking@thorking:~$ usr=thorkingThorKing01thorking
thorking@thorking:~$ echo ${usr}
thorkingThorKing01thorking
thorking@thorking:~$ echo ${usr#thor}
kingThorKing01thorking
thorking@thorking:~$ echo ${usr##thor}
kingThorKing01thorking

PS:鸟哥书中写的是##是要删除最长的数据,一开始不能理解何为最长的数据。

%为从后往前检索子串进行删除

${string%substring} 
从变量$string结尾开始删除最短匹配$substring子串

${string%%substring} 
从变量$string结尾开始删除最长匹配$substring子串

thorking@thorking:~$ echo ${usr%thor}  最后是king不会删除thor
thorkingThorKing01thorking
thorking@thorking:~$ echo ${usr%king}
thorkingThorKing01thor
thorking@thorking:~$ echo ${usr%%king}
thorkingThorKing01thor
thorking@thorking:~$ echo ${usr%o*king}
thorkingThorKing01th
thorking@thorking:~$ echo ${usr%%o*king}
th

注意:在进行#或##匹配时,$string的首字符必须是被删除子串$substring的第一个字符,不然无法匹配删除; 
在进行%或者%%匹配时,$string的最后一个字符必须是被删除子串$substring的最后一个字符,不然无法进行删除操作;

二、变量的替换

使用/

${parameter/parttern/string} 
用string来替换第一个匹配的pattern

${parameter/#parttern/string} 
从开头匹配parameter变量中的pattern,匹配上后就用string来替换匹配的pattern

${parameter/%pattern/string} 
从结尾开始匹配parameter变量中的pattern,匹配上后就用string替换匹配的pattern

${parameter//pattern/string} 
用string来替换parameter变量中所有匹配的pattern
 

thorking@thorking:~$ echo ${usr/thor/king}
kingkingThorKing01thorking
thorking@thorking:~$ echo ${usr//thor/king}
kingkingThorKing01kingking
thorking@thorking:~$ echo ${usr/#thor/king}
kingkingThorKing01thorking
thorking@thorking:~$ echo ${usr/%thor/king}    最后是king不会匹配
thorkingThorKing01thorking
thorking@thorking:~$ echo ${usr/%king/thor}
thorkingThorKing01thorthor
thorking@thorking:~$ echo ${usr}
thorkingThorKing01thorking

发现其中有个奇怪的特例

包含最后为bin的不能用从后往前删除,即%

但是在子串中去掉bin之后就可以了,很是奇怪。。。

发布了58 篇原创文章 · 获赞 64 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ThorKing01/article/details/103508693