1

dnsmasq.conf の行全体を bash スクリプトで置き換えたい状況があります。

デフォルトでは、行は次のとおりです。

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

私は ./test.sh 172.24.239.40 172.24.239.255 として bash を呼び出しており、次の行を取得しています。

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

すなわち

  • 単一引用符の代わりに二重引用符を使用して、変数を展開できるようにする
  • 複数回呼び出す代わりに、単一の 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 に答える