${ } 引用变量的高级用法

1,029 阅读2分钟

1、字符串删除

1.1 删除开头或结尾的整段字符串

格式:

 ${变量#匹配规则}        //从头开始匹配,最短删除;
 ​
 ${变量##匹配规则}       //从头开始匹配,最长删除;
 ​
 ${变量%匹配规则}        //从尾开始匹配,最短删除;
 ​
 ${变量%%匹配规则}       //从尾开始匹配,最长删除;

示例:

 ${i#*,}       //从左往右最短匹配,以第一个逗号为休止符,将这之间的所有字符都删除(包括第一个逗号)
 ${i##*,}     //从左往右最长匹配,以最后一个逗号为休止符,将这之间的所有字符都删除(包括最后第一个逗号)
 ​
 ${i%,*}      //从右往左最短匹配,以第一个逗号为休止符,将这之间的所有字符都删除(包括第一个逗号)
 ${i%%,*}     //从右往左最长匹配,以最后一个逗号为休止符,将这之间的所有字符都删除(包括最后一个逗号)

演示1:

 [root@yuji ~]# i="11,22,33,44"
 [root@yuji ~]# echo $i
 11,22,33,44
 [root@yuji ~]# echo ${i#*,}
 22,33,44
 [root@yuji ~]# echo ${i##*,}
 44
 [root@yuji ~]# echo ${i%,*}
 11,22,33
 [root@yuji ~]# echo ${i%%,*}
 11

1字符串删除.png

演示2:

 [root@yuji ~]# name="the great gatsby"
 [root@yuji ~]# echo $name
 the great gatsby
 [root@yuji ~]# echo ${name#*a}
 t gatsby
 [root@yuji ~]# echo ${name##*a}
 tsby
 [root@yuji ~]# echo ${name%a*}
 the great g
 [root@yuji ~]# echo ${name%%a*}
 the gre

1字符串删除2.png

1.2 删除中间的某个字符或单词

格式:

 ${变量/pattern/}        //删除第一次被pattern匹配到的字符或字符串
 ​
 ${变量//pattern/}       //删除所有被pattern匹配到的字符或字符串
 ​
 ${变量/#pattern/}       //删除开头被pattern匹配到的字符或字符串
 ​
 ${变量/%pattern/}       //删除结尾被pattern匹配到的字符或字符串

示例:

 ${i/a/}         //删除第一次匹配到的a
 ​
 ${i//a/}        //删除所有的a
 ​
 ${i/#a/}        //删除开头的aa必须是开头第一个字符才会被删除)
 ​
 ${i/%a/}        //删除结尾的aa必须是结尾最后一个字符才会被删除)

演示:

 [root@yuji ~]# j="aa,bb,cc,bb,aa"
 [root@yuji ~]# echo $j
 aa,bb,cc,bb,aa
 [root@yuji ~]# echo ${j/bb/}      //删除第一次匹配到的bb
 aa,,cc,bb,aa
 [root@yuji ~]# echo ${j//bb/}     //删除所有bb
 aa,,cc,,aa
 [root@yuji ~]# echo ${j/#bb/}     //删除开头的bb,因为开头不是bb,所以不会生效
 aa,bb,cc,bb,aa
 [root@yuji ~]# echo ${j/#aa/}     //删除开头的aa
 ,bb,cc,bb,aa 
 [root@yuji ~]# echo ${j/%aa/}     //删除结尾的aa
 aa,bb,cc,bb,

1字符串删除3.png

2、字符串替换

格式:

 ${变量/旧字符串/新字符串}     //替换变量内的旧字符串为新字符串,只替换第一次匹配到的
 ​
 ${变量//旧字符串/新字符串}    //替换变量内的旧字符串为新字符串,全部替换
 ​
 ${变量/%旧字符串/新字符串}    //替换变量内的旧字符串为新字符串,只替换结尾的

示例:

 ${i/a/b}      //将第一个a替换成b
 ${i//a/b}     //将所有a替换成b
 ${i/#a/b}     //将开头的a替换成ba必须是开头第一个字符才会被替换)
 ${i/%a/b}     //将结尾的a替换成ba必须是结尾最后一个字符才会被替换)

演示:

 [root@yuji ~]# k="aa,bb,cc,aa"
 [root@yuji ~]# echo $k
 aa,bb,cc,aa
 [root@yuji ~]# echo ${k/aa/999}      //将第一个aa替换成999
 999,bb,cc,aa
 [root@yuji ~]# echo ${k//aa/999}     //将所有aa替换成999
 999,bb,cc,999
 [root@yuji ~]# echo ${k/%aa/999}     //将结尾的aa替换成999
 aa,bb,cc,999

1字符串替换.png

3、字符串切片

格式:

 ${#变量名}    //获取字符串长度
  
 #字符下标值(字符索引):
 字符串内,第一个字符的下标值为0,第二个字符的下标值为1,最后一个字符的下标值为字符串长度减1。
  
 ${变量名:开始的下标值:截取长度}      //截取字符串,字符的下标值(索引)从0开始

示例:

 i="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  
 字符串长度:${#i}                      //此时长度为62
 字符串内的字符下标值:0-61
 截取第一个字符:${i:0:1}  
 截取前三个字符:${i:0:3}
 截取最后一个字符:${i:61:1}

字符串切片在之前的文章中有详细介绍,这里不再赘述。可以查看:

shell编程之循环语句 for (包看包会 如果不会 再看一遍) - 掘金 (juejin.cn)