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

Kim*_*cks 1 unix bash 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
Run Code Online (Sandbox Code Playgroud)

代码可以成功地编写内容/etc/nginx/sites-available/abc.conf.

不过,我有两个bash的变量$WEBAPP$APPFOLDER.他们表现完全一样的文件,而不是内部example.comabcapp这正是我打算.

如何使脚本按预期工作?

ric*_*ici 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
Run Code Online (Sandbox Code Playgroud)

你真的不需要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
Run Code Online (Sandbox Code Playgroud)

在第二个示例中,using <<ENDOFCONTENT指示$VARs应替换为其值<<'ENDOFCONTENT'将阻止参数替换.