我正在编写一个脚本,该脚本应该修改文件上变量的值,该文件看起来像这样:
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = triton.itinet.fr
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = triton, localhost.localdomain, localhost
relayhost = smtp.free.fr
home_mailbox = Maildir/
virtual_mailbox_domains = $myhostname
virtual_mailbox_base = /var/mail/
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
#virtual_alias_maps = hash:/etc/postfix/virtual
我想通过用户入口修改relayhost的值,我已经这样做了
modify_relayhost ()
{
read new_relayhost
if (test -e /etc/postfix/main.cf)
then
grep "relayhost" /etc/postfix/main.cf | cut -d= -f1 && echo $new_relayhost
fi
}
但它不会修改文件,它只是打印那个名为relayhost的值并在提示符上写入用户的值
您可以在单个sed命令中执行此操作:
read new_relayhost
sed -i.bak -E 's/^([ \t]*relayhost[ \t]*=[ \t]*).*/\1'"$new_relayhost"'/' /etc/postfix/main.cf
此sed
命令查找由可选空格包围的relayhost
键,并将其值部分替换为变量$new_relayhost
的值。
这个简单的bash
脚本可以做到这一点。我使用read
命令读取用户提示符和sed
进行替换
#!/bin/bash
read -p "enter relayhost value: " relayhost
if [ -f /etc/postfix/main.cf ];
then
sed -i.bak -r "s/(relayhost *= *).*/\1$relayhost/" /etc/postfix/main.cf
fi
现在运行脚本
$ bash script.sh
enter relayhost value: abcd
$ cat /etc/postfix/main.cf
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = triton.itinet.fr
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = triton, localhost.localdomain, localhost
relayhost = abcd
home_mailbox = Maildir/
virtual_mailbox_domains = $myhostname
virtual_mailbox_base = /var/mail/
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
#virtual_alias_maps = hash:/etc/postfix/virtual
使用Perl:
host='new.host'
perl -pi.orig -e 's/^(\s*relayhost\s*=).*$/\1'"$host"'/' /etc/postfix/main.cf
使用-p
选项,perl
就像一个类似于grep或sed的过滤器。它实际上在(
-i. orig
选项创建原始文件(main.cf.orig
)的备份副本,并就地修改文件。
替换应用于文件中的每一行。它捕获左侧部分(\s*relayhost\s*=
)并将其与新值($host
)连接。
请注意,替换仅适用于第一个匹配。如果要替换所有出现的变量,请使用g
修饰符。