如何使用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命令再開始


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM