2013-07-29 32 views
1

以下是我的bash脚本将写入nginx配置文件的一段内容。bash脚本将内容写入文件。文件内容需要bash变量。怎么做?

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

但是,我有两个bash变量$WEBAPP$APPFOLDER。它们表现得与文件内部完全一样,而不是example.comabcapp,这正是我的意图。

如何使脚本按预期工作?

+0

http://www.tldp.org/LDP/abs/html/here-docs.html – ccpizza

+0

帮你一个忙,忘了'read'的存在。这很少有必要而且经常被滥用。 – msw

回答

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将取代变量。

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应该用它们的值<<'ENDOFCONTENT'替换会阻止参数替换。

+0

在第二个例子中,你的意思是'cat'而不是'cp'吗?在我的机器上,'cat> bar <<< foo'起作用,但'cp> bar <<< foo'不起作用。 –

+0

@JeffBowman:是的,谢谢。 C&P错误。固定。 – rici