2013-07-29 44 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