[英]bash script to write content into file. File content requires bash variables. How to do that?
以下是我的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
。
如何使脚本按预期工作?
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'
将防止参数替换。
您实际上是通过将'ENDFILECONTENT'
括在引号中来故意关闭参数'ENDFILECONTENT'
。 请参见Heredocs上高级Bash脚本指南的示例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将按预期替换变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.