以下是我的bash脚本将写入nginx配置文件的一段内容。
WEBAPP=example.com
APPFOLDER=abcapp
CONFFILENAME=abc.conf
read -r -d '' FILECONTENT <<'ENDFILECONTENT'
server {
listen 80;
client_max_body_size 2M;
server_name $WEBAPP;
root /var/virtual/stage.$WEBAPP/current/src/$APPFOLDER/webroot;
}
ENDFILECONTENT
echo "$FILECONTENT" > /etc/nginx/sites-available/$CONFFILENAME
代码可以成功地在/etc/nginx/sites-available/abc.conf
内编写内容。
但是,我在$WEBAPP
和$APPFOLDER
中有两个bash变量。它们的表现方式与文件内部完全相同,而不是我想要的example.com
和abcapp
。
如何让脚本按预期工作?
答案 0 :(得分:5)
bash允许引用字符串中的换行符。它在双引号字符串($FOO
)内进行参数替换(即FOO
替换为"$FOO"
的值),但不在单引号字符串中'$FOO'
)。
所以你可以这样做:
FILECONTENT="server {
listen 80;
client_max_body_size 2M;
server_name $WEBAPP;
root /var/virtual/stage.$WEBAPP/current/src/$APPFOLDER/webroot;
}"
echo "$FILECONTENT" > /etc/nginx/sites-available/$CONFFILENAME
您真的不需要FILECONTENT
参数,因为您可以直接复制到该文件:
cat >/etc/nginx/sites-available/$CONFFILENAME <<ENDOFCONTENT
server {
listen 80;
client_max_body_size 2M;
server_name $WEBAPP;
root /var/virtual/stage.$WEBAPP/current/src/$APPFOLDER/webroot;
}
ENDOFCONTENT
在第二个示例中,使用<<ENDOFCONTENT
表示$VAR
s应替换为其值<<'ENDOFCONTENT'
将阻止参数替换。
答案 1 :(得分:1)
你实际上故意通过在引号中包含'ENDFILECONTENT'
来关闭参数替换。请参阅the advanced Bash scripting guide on Heredocs的示例19-7中的摘录,稍微重新格式化:
# No parameter substitution when the "limit string" is quoted or escaped.
# Either of the following at the head of the here document would have
# the same effect.
#
# cat <<"Endofmessage"
# cat <<\Endofmessage
删除'ENDFILECONTENT'
周围的单引号,BASH将按预期替换变量。