删除包含存储在不在sed中工作的变量的字符串的行

时间:2018-04-24 15:13:34

标签: shell sed sh

我正在尝试从bind的named.conf文件中删除现有的区域记录(在CentOS 7版本上)。

区域记录如下:

zone "example.com" IN {
        type master;
        file "example.com.zone";
};

命令:

sed -nie '/\"example.com\"/,/^\};$/d;p;' /etc/named.conf

删除该记录(假设)。

接下来,我创建了以下具有可执行权限的shell脚本(rm-zone.sh)来执行相同的工作:

#!/bin/sh

[ $# -lt 1 ] && {
        echo "usage: $0 <domain>"
        exit 1
}

domain=$1

sed -nie '/\"$domain\"/,/^\};$/d;p;' /etc/named.conf

rndc reload

echo Zone: $domain deleted successfully

当我以root身份登录并运行命令时:

./rm-zone.sh example.com

我看到消息“Zone example.com已成功删除”但该区域仍在我的named.conf文件中...

再次,当我从cli:

提供上述命令时
sed -nie '/\"example.com\"/,/^\};$/d;p;' /etc/named.conf

该区域被正确删除!!!

显然shell脚本有问题,但没有设法找出它是什么。

对于我在这里所缺少的任何想法将不胜感激!

1 个答案:

答案 0 :(得分:1)

您的想法是正确的,但是要扩展变量domain,它需要存在于双引号内。 shell在将参数传递给sed之前扩展变量,没有正确引用,模式$domain被解释为文字字符串。您可以按如下方式嵌套引号

sed -nie '/\"'"$domain"'\"/,/^\};$/d;p;' /etc/named.conf