背景
最近在研究一鍵部署,其中有一個環節,是要使用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命令再開始
