You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:10:46