我正在尝试读取模板文件,然后按照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;使用反斜杠或将其更改为
的字符'<' or '>'
e.g。
\<Directory "/Library/WebServer/Documents/${website_name}"\>
但这会产生同样的错误 和
<Directory "/Library/WebServer/Documents/${website_name}">
给出了这个错误:
gt:找不到命令
我也尝试用双引号包装整个模板文件,但没有运气。
在这种情况下,我做错了什么?
谢谢!
答案 0 :(得分:1)
在$line
附近放置单引号(不是双引号):
eval echo '$line'
编辑:我之前误解了这个问题。该解决方案不需要eval
,但可以使用简单的替换来完成:
line=${line/\${website_name\}/$website_name}
echo $line