如何使用sed在文件中确定行插入带有变量的字符串

背景

最近在研究一键部署,其中有一个环节,是要使用shell脚本放开防火墙的某个端口号

方法

使用shell中常见的插入文本命令:sed

问题

如果已经预知要打开的端口号如6379,可以使用:sed -i '10a\-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT' /etc/sysconfig/iptables 来实现

但是目前的端口号为未知变量$port,如果使用:sed -i '10a\-A INPUT -m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT' /etc/sysconfig/iptables的植方式来写入,在iptables中仍然显示的是变量名,而不是变量名的值

这是一个大坑大坑

找了很长时间的解决方法,比如加"",加\。。。。,都没有用

终于在今天,一举突破,感谢给我提供思路和解决方案的陌生人,喝水不忘挖井人:http://www.capjsj.cn/sed_variable.html

解决方式为:sed -i '10i-A INPUT -m state --state NEW -m tcp -p tcp --dport '$port' -j ACCEPT' /etc/sysconfig/iptables

授人以鱼不如授人以渔,产生问题的原因是:

因为 $port 是shell变量而不是sed中的变量,需要单独拿到 sed 的单引号外面来才能被 shell 解析。单引号里面是 sed 的势力范围,shell 无法触及。

sed的参数后的命令,是以单引号开始,单引号结束的,所以想将shell变量拿出来,那就在变量前面加个单引号让sed命令结束,再在变量后面再加个单引号让sed命令再开始

猜你喜欢

转载自www.cnblogs.com/jasmine095/p/11273374.html