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

如何在Bash脚本的echo语句中使用for循环生成多域名Nginx配置文件

解决Nginx多域名配置自动生成脚本问题

问题分析

你的脚本存在两个核心问题:

  1. 多个echo命令单独执行,只有最后一个echo的内容被写入output.text,前面的输出都直接打印到终端,没有写入文件;
  2. 循环生成带www.前缀的域名时,每个域名单独一行输出,无法满足server_name同一行的要求。

修正后的脚本

# 接收所有传入的域名参数
ALL_DOMAINS=("$@")

# 拼接所有带www.前缀的域名,用空格分隔
WWW_DOMAINS=""
for domain in "${ALL_DOMAINS[@]}"; do
    WWW_DOMAINS="$WWW_DOMAINS www.$domain"
done

# 合并原始域名与www前缀域名,作为server_name的完整值
SERVER_NAMES="${ALL_DOMAINS[*]} $WWW_DOMAINS"

# 用Here-Document生成完整配置并写入文件
cat > output.text <<EOF
server {
        listen 80;
        listen [::]:80;

        root /var/www/${ALL_DOMAINS[0]}/html;
        index index.html index.php index.htm index.nginx-debian.html;

        server_name $SERVER_NAMES;

        more lines here.
        more
        more
        more

}
EOF

关键修正点

  • 统一输出到文件:使用Here-Document(<<EOF)替代多个分散的echo,确保所有配置内容一次性写入文件,避免部分内容丢失;
  • 同一行生成www域名:通过变量拼接,把所有带www.前缀的域名整合到一个字符串中,用空格分隔,保证server_name行的所有域名在同一行;
  • 变量正确解析:Here-Document中未加引号的EOF会自动解析变量(如$SERVER_NAMES、${ALL_DOMAINS[0]}),解决原脚本单引号中变量无法展开的问题;
  • 保留原逻辑:依然使用第一个传入的域名作为网站根目录路径,和你原脚本的逻辑保持一致。

测试验证

执行./setup.sh domain1.com domain2.com后,output.text中的server_name行会生成:

server_name domain1.com domain2.com www.domain1.com www.domain2.com;

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:54:27