读取模板文件并使用Bash替换变量

时间:2015-04-09 09:06:03

标签: bash shell

我正在尝试读取模板文件,然后按照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"

然而,我的真实模板文件包含一些无效字符,例如&lt;和&gt;特点: 这是我的完整模板文件:

<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;和&gt;使用反斜杠或将其更改为

的字符
'&lt;' or '&gt;'

e.g。

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

但这会产生同样的错误 和

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

给出了这个错误:

gt:找不到命令

我也尝试用双引号包装整个模板文件,但没有运气。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

$line附近放置单引号(不是双引号):

eval echo '$line'

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

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