求助:使用sed结合模板批量生成Apache虚拟主机配置文件
用sed批量生成Apache虚拟主机配置文件
问题场景
需要基于模板文件/tmp/dlist1,从/tmp/server_name_list读取域名列表,批量生成对应Apache虚拟主机配置文件。要求每个域名(如abc.com)生成abc.conf,并将模板中的DIR替换为域名前缀(如abc)。
模板文件/tmp/dlist1内容:
Allow From All DocumentRoot /var/www/html/DIR ServerName DIR.com ServerAlias www.DIR.com DirectoryIndex index.html index.htm ErrorLog "logs/DIR_com_error_log" CustomLog "logs/DIR_com_access_log" common
域名列表/tmp/server_name_list内容:
abc.com xyz.com utv.com
期望生成的abc.conf示例:
Allow From All DocumentRoot /var/www/html/abc ServerName abc.com ServerAlias www.abc.com DirectoryIndex index.html index.htm ErrorLog "logs/abc_com_error_log" CustomLog "logs/abc_com_access_log" common
现有脚本问题
原脚本存在3个关键问题:
- 单引号包裹sed替换命令,导致变量
${j}无法被Shell解析,只会被当作字面量${j}替换DIR。 - 使用
sed -i修改模板文件本身,而我们需要保留模板,只输出替换后的内容到新文件。 - 循环变量直接使用完整域名(如
abc.com),但替换需要的是域名前缀(如abc),未做提取处理。
修正后的脚本
while IFS= read -r domain; do # 提取域名前缀,去除末尾的.com prefix="${domain%.com}" # 替换模板中的DIR为前缀,输出到对应配置文件 sed "s/DIR/${prefix}/g" /tmp/dlist1 > "/tmp/${prefix}.conf" done < /tmp/server_name_list
脚本说明
while IFS= read -r domain:安全读取域名列表的每一行,避免空格或特殊字符解析问题。prefix="${domain%.com}":通过Shell参数扩展,移除域名末尾的.com,得到所需前缀。sed "s/DIR/${prefix}/g":使用双引号包裹替换命令,确保变量${prefix}被正确解析,全局替换模板中的DIR。- 输出重定向到
/tmp/${prefix}.conf,生成对应名称的配置文件。
验证结果
执行脚本后,会在/tmp目录下生成abc.conf、xyz.conf、utv.conf三个文件,每个文件内容与预期一致。
内容的提问来源于stack exchange,提问作者a3kartik
相关产品推荐
相关产品推荐

