【问题标题】:Read template file and replace variable using Bash使用 Bash 读取模板文件并替换变量
【发布时间】:2015-04-09 09:06:03
【问题描述】:

我正在尝试读取模板文件,然后按照this answer 中的建议使用 Bash shell 替换此文件中的变量。

这是我的代码:

#!/usr/local/bin/bash
website_name=new_website_name
while read line 
do
    eval echo "$line"
done < "/etc/apache2/extra/vhost-template.txt"

这适用于包含以下内容的测试模板文件 (vhost-template.txt):

Directory "/Library/WebServer/Documents/${website_name}"

占位符被替换,我得到正确的输出:

Directory "/Library/WebServer/Documents/new_website_name"

但是我的真实模板文件包含一些无效字符,例如 字符: 这是我的完整模板文件:

<VirtualHost *:80>
    ServerAdmin myemailaddress@xyz.com
    DocumentRoot "/Library/WebServer/Documents/${website_name}/web/"
    ServerName dev.${website_root_dir}.com
    ErrorLog "/private/var/log/apache2/${website_name}-dev-error_log"
    CustomLog "/private/var/log/apache2/${website_name}-dev-access_log" common

    <Directory "/Library/WebServer/Documents/${website_name}">
       Options Indexes FollowSymLinks
       AllowOverride All
       Order allow,deny
       Allow from all
    </Directory>
</VirtualHost>

这会导致以下错误:

./virtualsetup.sh: eval: line 5: syntax error near unexpected token `newline'

./virtualsetup.sh: eval: line 5: `echo <Directory "/Library/WebServer/Documents/${website_name}">'

我尝试使用反斜杠转义 字符或将它们更改为

'&lt;' or '&gt;'

例如

\<Directory "/Library/WebServer/Documents/${website_name}"\>

但这给出了同样的错误 和

&lt;Directory "/Library/WebServer/Documents/${website_name}"&gt;

给出这个错误:

gt: 找不到命令

我也尝试将整个模板文件用双引号括起来,但没有成功。

在这种情况下我做错了什么?

谢谢!

【问题讨论】:

  • "/Library/WebServer/Documents/${website_name}" 中有什么内容?他们是var=value 对吗?如果他们是,你为什么要eval他们而不是source他们?
  • 我可能应该多解释一下我想要做什么。我试图通过从模板文件中读取标准虚拟主机然后用用户输入替换某些元素来自动在 apache 中创建虚拟主机。我将使用完整的模板文件编辑上面的问题。

标签: bash shell


【解决方案1】:

$line 周围加上单引号(不是双引号):

eval echo '$line'

编辑:我之前误解了这个问题。该解决方案不需要eval,但可以使用简单的替换来完成:

line=${line/\${website_name\}/$website_name}
echo $line

【讨论】:

  • 嗨@cdarke,这在一定程度上对我有用。如果我使用单引号,它会输出模板文件而没有任何错误,但是模板文件中的占位符不会被变量(new_website_name)替换。例如。我现在得到这个返回:
猜你喜欢
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2018-02-06
  • 2019-08-18
  • 1970-01-01
相关资源
最近更新 更多