Linux:sed的命令中插入变量的方法
编辑:狂族晨曦 来源:脚本编程,系统运维,经验杂笔 日期:2017-08-08 阅读: 10,692 次 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)
转载请注明出处来自https://www.capjsj.cn/sed_variable.html
过来活动下筋骨
我也过来活动下筋骨。