1

以下是我的 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和中有两个 bash 变量$APPFOLDER。它们的表现与文件中的完全一样,而不是example.comabcapp想要的。

如何使脚本按预期工作?

4

2 回答 2

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

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

于 2013-07-29T04:20:27.293 回答
1

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

于 2013-07-29T04:19:47.923 回答