成航先森 成航先森

成都航院计算机系一个学生的个人博客

 

经验杂笔

分段图

最新文章

经验杂笔
当前位置: 首页 » 大学杂谈 » 经验杂笔 » Linux:sed的命令中插入变量的方法

Linux:sed的命令中插入变量的方法

编辑:狂族晨曦 来源:经验杂笔 日期:2017-08-08 阅读: 2,171 次 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}

sed.png

hostname.sh

历史上的今天:

标签:
除特别注明外,本站所有文章均为成航先森 www.capjsj.cn原创,本文共1190个字
转载请注明出处来自http://www.capjsj.cn/sed_variable.html
已有 2 位"计工"发布了激烈的评论,还有N多人围观笑而不语评论
Koolight的头像
欢迎发表评论
取消评论

表情
疑问调皮伤心抠鼻黑线微笑可爱奸笑震惊吓到了撇嘴大兵忍不住笑笑狂骂狂怒噢?鼓掌酷⊙﹏⊙b汗鄙视大哭嘿嘿

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. 小C博客的头像

    过来活动下筋骨

    2017-08-09 19:26 回复
  2. Koolight的头像

    我也过来活动下筋骨。

    2017-08-14 22:34 回复
官方微信
发表评论 返回顶部