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

时间:2013-07-29 03:51:36

标签: bash unix file-io

以下是我的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

如何让脚本按预期工作?

2 个答案:

答案 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将按预期替换变量。