如何在Bash脚本的echo语句中使用for循环生成多域名Nginx配置文件
解决Nginx多域名配置自动生成脚本问题
问题分析
你的脚本存在两个核心问题:
- 多个
echo命令单独执行,只有最后一个echo的内容被写入output.text,前面的输出都直接打印到终端,没有写入文件; - 循环生成带
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
相关产品推荐
相关产品推荐

