Shell脚本中的命令会展开双引号中的变量但是单引号不行
文章目录
- 前言
- 问题出现
- 解决办法
- 总结
前言
昨晚测试到了半夜,算是凌晨提前过了个节,既然是过节了,就不正那么复杂的知识了,记录一个最近发现的小知识点,本来没什么,但AI告诉的错误的原因后有种恍然大明白的感觉,一起快速看一下
问题出现
本来有个脚本用于替换配置文件中的数据,在部署前确保配置变量的正确性,其中是用 sed 命令实现,使用方法很简单,假如有 example.txt 文件,内容如下:
$ cat example.txt
<Property Port="3987">
假如把文件中的Port换成Bind,写法很简单
$ sed 's/Port/Bind/g' example.txt
<Property Bind="3987" balabala>
如果被替换的值是通过变量传递到脚本中的也是没问题的
$ newval=Bind2$ sed "s/Port/$newval/g" example.txt
<Property Bind2="3987" balabala>
如果想替换其中的数字,但是文件中的数字很多,可能存在多个3987,不能直接替换,需要写的更具体一点
比如把 Port=“3987” 换成 Port=“3988”
初步写法是这样 sed "s/Port="[^"]*"/Port="$newval"/g" example.txt 但肯定不行,因为引号乱套了,一执行就报错,所以改成了单引号
$ sed 's/Port="[^"]*"/Port="$newval"/g' example.txt
<Property Port="$newval" balabala>
这次不报错了,但是结果不对了,这也就是我遇到的小问题
解决办法
要想找解决办法首先得知道原因,其实在标题中已经说过了,一个变量要想被展开需要放到双引号中,在单引号中是不行的,sed命令后面需要改为双引号,那怎么解决呢?
把命令中的双引号转义一下就行了
$ newnum=3988$ sed "s/Port=\"[^\"]*\"/Port=\"$newnum\"/g" example.txt
<Property Port="3988" balabala>
好了,到此就完美解决了,再解释下这个替换正则表达
Port=匹配文本中出现的字符串Port=\"匹配一个双引号", 因为在命令中双引号需要转义[^\"]*匹配 任意数量 的 非双引号字符(即双引号内的内容)\"再匹配结尾的那个引号
整体意思是匹配类似于 Port="任意内容"
总结
- Shell脚本中如要想在文本中展开一个变量使用双引号包裹,单引号没有这个作用
- 1024节日快乐
茫茫人生路,无时无刻不在前进,你往前迈一步是前进,往后迈一步也是前进,你又有什么办法退回去呢,不过是被推着走罢了,向前推或者向后推,反正时间在流逝
