1

我有一种情况,我想要一个 bash 脚本来替换 dnsmasq.conf 中的整行

默认情况下,行是:

listen-address=192.168.42.1
dhcp-range=192.168.42.1,192.168.42.253,255.255.255.0,192.168.42.255,24h
dhcp-option=option:router,192.168.42.1

我实施:

new_ip=$1
broadcast=$2
base_ip=`echo $new_ip | cut -d"." -f1-3`

sed -i 's/^listen-address.*/listen-address=$new_ip/' /etc/dnsmasq.conf
sed -i 's/^dhcp-range.*/dhcp-range=$base_ip.1,$base_ip.254,255.255.255.0,$broadcast,24h/' /etc/dnsmasq.conf
sed -i 's/^dhcp-option.*/dhcp-option=option:router,$new_ip/' /etc/dnsmasq.conf

我将 bash 称为 ./test.sh 172.24.239.40 172.24.239.255 并获得以下行:

listen-address=$new_ip
dhcp-range=$base_ip.1,$base_ip.254,255.255.255.0,$broadcast,24h
dhcp-option=option:router,$new_ip

是否可以将参数与 sed 命令行中的文本分离?

4

2 回答 2

1

您可以使用:

sed -i.bak -e "s/^listen-address.*/listen-address=$new_ip/" \
 -e "s/^dhcp-range.*/dhcp-range=$base_ip.1,$base_ip.254,255.255.255.0,$broadcast,24h/" \
 -e "s/^dhcp-option.*/dhcp-option=option:router,$new_ip/" /etc/dnsmasq.conf

IE

  • 使用双引号而不是单引号来允许变量扩展
  • 在单个 sed中使用多个替换命令而不是sed多次调用
  • 使用扩展名-i.bak来保持原始文件的安全.bak
于 2015-01-08T14:56:43.017 回答
1

当 sed 中有变量时,使用双引号而不是单引号:

sed -i "s/^listen-address.*/listen-address=$new_ip/" /etc/dnsmasq.conf
sed -i "s/^dhcp-range.*/dhcp-range=$base_ip.1,$base_ip.254,255.255.255.0,$broadcast,24h/" /etc/dnsmasq.conf
sed -i "s/^dhcp-option.*/dhcp-option=option:router,$new_ip/" /etc/dnsmasq.conf
于 2015-01-08T14:57:24.553 回答