Linux:sed的命令中插入變量的方法
編輯:狂族晨曦 來源:腳本編程,系統運維,經驗雜筆 日期:2017-08-08 閱讀: 11,036 次 2 條評論 » 百度已收錄
先森近期接到個任務,這個任務中一項是需要每個服務器都得有自己的主機名,而不是默認的“localhost”。因為是CentOS 6的操作系統,所以需要改的文件有兩個,且為了不用重啟才生效,還要用hostname這個命令指定主機名。
hostname命令用于顯示和設置系統的主機名稱。環境變量HOSTNAME也保存了當前的主機名。在使用hostname命令設置主機名后,系統并不會永久保存新的主機名,重新啟動機器之后還是原來的主機名。如果需要永久修改主機名,需要同時修改/etc/hosts和/etc/sysconfig/network的相關內容。
如果每臺服務器都去手動修改這兩個文件和執行hostname命令未免太過麻煩,所以先森寫了一個簡單的腳本。想用“./腳本名 主機名”的方式修改主機名,但是實現腳本的過程中發生了一點小問題。
hostname=$1 sed -i 's/HOSTNAME=.*/HOSTNAME=$hostname/g' /etc/sysconfig/network
先森想用sed命令用指定的變量值來替換“HOSTNAME=”后面指定的值,但執行后發現,等號后面的值變成了$符號+變量名稱,也就是sed命令中不認這個變量。
后來經過百度一番,找到了答案:
“因為 hostname 是shell變量而不是sed中的變量,需要單獨拿到 sed 的單引號外面來才能被 shell 解析。單引號里面是 sed 的勢力范圍,shell 無法觸及。”
sed的參數后的命令,是已單引號開始,單引號結束的,所以想將shell變量拿出來,那就在變量前面加個單引號讓sed命令結束,再在變量后面再加個單引號讓sed命令再開始,已就是這樣:
hostname=$1 sed -i 's/HOSTNAME=.*/HOSTNAME='$hostname'/g' /etc/sysconfig/network
感覺這種代碼的編輯模式很眼熟,一下就想到了在HTML里面寫PHP的樣子:
<?php if (is_home()){ ?> </body> <?php } ?>
寫腳本突然有點寫PHP的感覺,著實讓先森覺得有點新鮮。下面貼下修改CentOS 6系統的主機名腳本。
#!/bin/bash
[ $# != 1 ] && echo "請指定主機名:./hostname.sh 主機名" && exit 1
hostname=$1
echo 127.0.0.1 ${hostname} >> /etc/hosts
sed -i 's/HOSTNAME=.*/HOSTNAME='$hostname'/g' /etc/sysconfig/network
hostname ${hostname}

hostname.sh
歷史上的今天:
- 2015: 迅雷推出神級技能:分享解壓密碼(0)
轉載請注明出處來自http://www.cnidcc.cn/sed_variable.html

川公網安備 51011202000104號
過來活動下筋骨
我也過來活動下筋骨。