# shell中常用的变量处理、字符串操作（之二）

- 5

- A+

所属分类：Shell 编程

上一篇文章中，我们提到了shell中常用的字符串处理操作，我们来回顾一下

一、获取变量的长度（字符串长度）。

二、对变量值进行截取（截取字符串）。

三、替换变量值中的某段字符。

四、删除变量值中的某段字符。

五、对变量值进行大小写转换。

六、当变量值为空时，对变量进行一些操作。

上篇文章中，我们已经总结了怎样获取变量长度，以及怎样对变量值进行截取，这篇文章中我们就来总结一下，怎样删除变量值中的字符串，以及怎样替换变量值中的字符串。

## 替换变量中的字符串

假如，我们想要把字符串"www.zsythink.net"中的"www"替换成"linux"，我们该怎么办呢？方法有很多种，不过此处，我们是来讨论操作变量的方法的，所以我们不考虑其他方法，我们来看一个替换变量中字符的示例，示例如下

上例表示，将website变量中的www替换成linux，就是这么简单，但是需要注意，上例中的写法，只能替换字符串中第一个遇到的"www"，如果字符串中包含多个"www"，只有第一个"www"会被替换，其他"www"不会被替换，示例如下

如果我们想要将字符串中的所有www都替换成linux，则可以使用如下语法，示例如下

除了上述两种方法能够替换变量中的字符串，其实还有两种方法，不过这两种方法针对性比较强，一种是针对行首的字符串进行替换，另一种是针对行尾的字符串进行替换，示例如下

没错，上图中的两个例子分别表示只替换行首的www，或者只替换行尾的www

## 删除变量中的字符串

只要理解了怎样替换变量中的字符串，再来理解怎样删除变量中的字符串，简直不要太简单，因为它们的语法几乎是一样。

假如，我们想要将字符串"www.zsythink.net"中的第一个"."替换成"@" ,可以使用如下语法

刚才说过，删除字符串的语法比替换字符串的语法更简单，如果我们想要删除上述字符串中的第一个"." 则可以使用如下方法

语法的确更简单，其实就是将替换字符串语法中的替换部分省略了。

同理，在删除字符串也有多种方法。

比如，刚才的示例中，我们只删除了字符串中的第一个"." ，如果我们想要删除字符串中的所有的"." ，则可以使用如下语法

聪明如你一定发现了，其实，删除字符串的语法是与替换字符串的语法其实是"对应的"。

那么综上所述，你应该已经可以推理出另外两种删除字符串的方法了。

没错，删除行首的某个字符串或者删除行尾的某个字符串的方法如下

好了，关于替换字符串与删除字符串的常用操作示例就先到这里，为了方便回顾，我们将上述常用操作进行一下小结，在小结中，有一些特殊情况的示例，不要错过哦~~

## 小结

### 删除字符串的操作

删除变量值中第一个遇到的指定字符串

语法：echo ${var/str}

Shell
#下例表示删除变量值中第一个遇到的"@" # teststr="zsy@think@linux" # echo ${teststr/@} zsythink@linux

1 2 3 4 | #下例表示删除变量值中第一个遇到的"@" # teststr="zsy@think@linux" # echo ${teststr/@} zsythink@linux

删除变量值中所有的指定字符串

语法：echo ${var//str}

Shell
#下例表示删除字符串中所有的"@" # teststr="zsy@think@linux" # echo ${teststr//@} zsythinklinux

1 2 3 4 | #下例表示删除字符串中所有的"@" # teststr="zsy@think@linux" # echo ${teststr//@} zsythinklinux

特殊情况

Shell
刚才总结了两种语法 语法一：删除变量值中所有的指定字符串的语法为echo ${var//str} 语法二：删除变量值中第一个遇到的指定字符串的语法为echo ${var/str} 如果，我们要删除字符串"/usr/local/chroot/usr/local"中第一个遇到的"/usr"，该怎么办呢？ 正常情况下，我们会套用上述语法二，将语法二中的"str"更改为"/usr"，套用语法二后的命令如下 # teststr="/usr/local/chroot/usr/local/nginx" # echo ${teststr//usr} 但是，套用语法二后的命令正好与上述语法一的语法结构相同，所以，本意是删除字符串中第一个遇到的"/usr"，但是最终结果却变为删除字符串中所有的"usr"，执行结果如下 # teststr="/usr/local/chroot/usr/local/nginx" # echo ${teststr//usr} //local/chroot//local/nginx 聪明如你一定想到了，这种情况需要对"/"进行转义，示例如下 # teststr="/usr/local/chroot/usr/local/nginx" # echo ${teststr/\/usr} /local/chroot/usr/local/nginx

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 刚才总结了两种语法 语法一：删除变量值中所有的指定字符串的语法为echo ${var//str} 语法二：删除变量值中第一个遇到的指定字符串的语法为echo ${var/str} 如果，我们要删除字符串"/usr/local/chroot/usr/local"中第一个遇到的"/usr"，该怎么办呢？ 正常情况下，我们会套用上述语法二，将语法二中的"str"更改为"/usr"，套用语法二后的命令如下 # teststr="/usr/local/chroot/usr/local/nginx" # echo ${teststr//usr} 但是，套用语法二后的命令正好与上述语法一的语法结构相同，所以，本意是删除字符串中第一个遇到的"/usr"，但是最终结果却变为删除字符串中所有的"usr"，执行结果如下 # teststr="/usr/local/chroot/usr/local/nginx" # echo ${teststr//usr} //local/chroot//local/nginx 聪明如你一定想到了，这种情况需要对"/"进行转义，示例如下 # teststr="/usr/local/chroot/usr/local/nginx" # echo ${teststr/\/usr} /local/chroot/usr/local/nginx

删除变量值中位于行首的指定字符串

语法：echo ${var/#str}

Shell
#下例表示删除字符串中行首的"H" # teststr="H.H.H.H.H.H" # echo ${teststr/#H} .H.H.H.H.H #下例表示删除字符串中行首的"#" # teststr="#zsy#think#linux" # echo ${teststr/##} zsy#think#linux

1 2 3 4 5 6 7 8 9 | #下例表示删除字符串中行首的"H" # teststr="H.H.H.H.H.H" # echo ${teststr/#H} .H.H.H.H.H #下例表示删除字符串中行首的"#" # teststr="#zsy#think#linux" # echo ${teststr/##} zsy#think#linux

特殊情况

Shell
参考之前的特殊情况，即可发现，由于删除字符串中行首的字符时需要使用语法"/#"，所以如果想要删除字符串中第一个遇到的"#"时，则不能使用"/#"，需要对"#"进行转义，示例如下，删除字符串中第一个遇到的"#" # teststr="zsy#think#linux" # echo ${teststr/\#} zsythink#linux

1 2 3 4 | 参考之前的特殊情况，即可发现，由于删除字符串中行首的字符时需要使用语法"/#"，所以如果想要删除字符串中第一个遇到的"#"时，则不能使用"/#"，需要对"#"进行转义，示例如下，删除字符串中第一个遇到的"#" # teststr="zsy#think#linux" # echo ${teststr/\#} zsythink#linux

删除变量值中位于行尾的指定字符串

语法：echo ${var/%str}

Shell
#下例表示删除字符串中行尾的"H" # teststr="H.H.H.H.H.H" # echo ${teststr/%H} H.H.H.H.H. #下例表示删除字符串中行尾的"%" # teststr="zsy%think%linux%" # echo ${teststr/%%} zsy%think%linux

1 2 3 4 5 6 7 8 9 | #下例表示删除字符串中行尾的"H" # teststr="H.H.H.H.H.H" # echo ${teststr/%H} H.H.H.H.H. #下例表示删除字符串中行尾的"%" # teststr="zsy%think%linux%" # echo ${teststr/%%} zsy%think%linux

特殊情况

Shell
参考之前的特殊情况，即可发现，由于删除字符串中行尾的字符时需要使用语法"/%"，所以如果想要删除字符串中第一个遇到的"%"时，则不能使用"/%"，需要对"%"进行转义 #示例如下，删除字符串中第一个遇到的"%" # teststr="zsy%think%linux%" # echo ${teststr/\%} zsythink%linux%

1 2 3 4 5 | 参考之前的特殊情况，即可发现，由于删除字符串中行尾的字符时需要使用语法"/%"，所以如果想要删除字符串中第一个遇到的"%"时，则不能使用"/%"，需要对"%"进行转义 #示例如下，删除字符串中第一个遇到的"%" # teststr="zsy%think%linux%" # echo ${teststr/\%} zsythink%linux%

### 替换字符串的操作

将变量值中第一个遇到的str1替换成str2

语法：echo ${var/str1/str2}

Shell
#下例表示将字符串中第一个遇到的"w"替换成"abc" # teststr="www" # echo ${teststr/w/abc} abcww

1 2 3 4 | #下例表示将字符串中第一个遇到的"w"替换成"abc" # teststr="www" # echo ${teststr/w/abc} abcww

将变量值中所有的str1替换成str2

语法：echo ${var//str1/str2}

Shell
#下例表示将字符串中所有"w"替换成"abc" # teststr="www" # echo ${teststr//w/abc} abcabcabc

1 2 3 4 | #下例表示将字符串中所有"w"替换成"abc" # teststr="www" # echo ${teststr//w/abc} abcabcabc

特殊情况

Shell
某些情况下需要进行转义，参考"删除字符串操作"总结部分的特殊情况。

1 | 某些情况下需要进行转义，参考"删除字符串操作"总结部分的特殊情况。

将变量值中位于行首的str1替换成str2

语法：echo ${var/#str1/str2}

Shell
#下例表示将字符串中位于行首的abc替换成123 # teststr="abcdefabc666abc888abc" # echo ${teststr/#abc/123} 123defabc666abc888abc

1 2 3 4 | #下例表示将字符串中位于行首的abc替换成123 # teststr="abcdefabc666abc888abc" # echo ${teststr/#abc/123} 123defabc666abc888abc

特殊情况

Shell
某些情况下需要对#号进行转义，参考"删除字符串操作"总结部分的特殊情况。

1 | 某些情况下需要对#号进行转义，参考"删除字符串操作"总结部分的特殊情况。

将变量值中位于行尾的str1替换成str2

语法：echo ${var/%str1/str2}

Shell
#下例表示将字符串中位于行尾的abc替换成666 # teststr="abcdefabc666abc888abc" # echo ${teststr/%abc/666} abcdefabc666abc888666

1 2 3 4 | #下例表示将字符串中位于行尾的abc替换成666 # teststr="abcdefabc666abc888abc" # echo ${teststr/%abc/666} abcdefabc666abc888666

特殊情况

Shell
某些情况下需要对%号进行转义，参考"删除字符串操作"总结部分的特殊情况。

1 | 某些情况下需要对%号进行转义，参考"删除字符串操作"总结部分的特殊情况。

这篇文章就总结到这里，希望能够对你有所帮助~~

我的微信公众号
关注"实用运维笔记"微信公众号，当博客中有新文章时，可第一时间得知哦~
赞 12
赏
分享

- Shell（bash）

- 版权声明：本站原创文章，于2017年9月4日17:46:21，由 朱双印 发表，共 1912 字。
- 如需转载，请在文章头部注明出处：shell中常用的变量处理、字符串操作（之二） | 朱双印博客

shell中常用的变量处理、字符串操作（之三）
shell中常用的变量处理、字符串操作（之一）
bash中 [ ] 与 [[ ]] 的区别
shell中’-gt’与’>’的区别

### 发表评论取消回复

欢迎 pangzi 再次光临！
修改信息

正在提交, 请稍候...
#

昵称*

邮箱*

网址

有回复时邮件通知我

## 目前评论：5 其中：访客 5 博主 0

2. echo 6
   回复 2019年10月22日 上午11:38 沙发

   回来 复习一下

4. 弓长缔 2
   回复 2019年10月13日 下午3:16 板凳

   echo ${teststr/#www} 和 echo ${teststr/www}有区别吗？什么时候会有区别呢？

   - 蓝风 2
     回复 2020年3月8日 上午11:47 1层

     @弓长缔 解析一下：${teststr/#www} only can change a word starting with “www” from “wwwabc” to “abc”, can’t it change the word from “abcwwwabc” to “abcabc”. But ${teststr/www} can do this.

6. chen 1
   回复 2019年9月26日 下午2:23 地板

   朱哥威武 -.-

8. 妞妞 4
   回复 2018年8月24日 下午2:39 4楼

   有没有人和我一样总是记不住，每次要用的时候就来这翻翻。

- 文章目录

×
×
拖拽到此处
图片将完成下载