繁体   English   中英

bash脚本将内容写入文件。 文件内容需要bash变量。 怎么做?

[英]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.comabcapp

如何使脚本按预期工作?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM