BASH - 选择性变量替换

时间:2017-02-14 10:08:45

标签: bash

我需要替换sippet中的变量,但我必须在apache虚拟主机中保留“$ 1”,例如:

SNIPPET=$(cat <<- 'EOF'
<VirtualHost *:80>
    ServerName ${HOSTNAME}
    DocumentRoot /usr/local/apache2/htdocs/${HOSTNAME}

    <Directory /usr/local/apache2/htdocs/${HOSTNAME}>
        Options -Indexes +FollowSymLinks +MultiViews
        Require all granted
    </Directory>

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php56:9000/usr/local/apache2/htdocs/${HOSTNAME}/$1

</VirtualHost>
EOF
)

我需要更改${HOSTNAME}但不是$1,是否可以?

1 个答案:

答案 0 :(得分:0)

您不需要在此使用cat;字符串可以包含嵌入的换行符。

SNIPPET="\
<VirtualHost *:80>
    ServerName ${HOSTNAME}
    DocumentRoot /usr/local/apache2/htdocs/${HOSTNAME}

    <Directory /usr/local/apache2/htdocs/${HOSTNAME}>
        Options -Indexes +FollowSymLinks +MultiViews
        Require all granted
    </Directory>

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php56:9000/usr/local/apache2/htdocs/${HOSTNAME}/\$1

</VirtualHost>"

在您的情况下,您希望至少有一个参数替换,您不能引用here-doc分隔符,因为它将整个 here-doc视为单引号字符串。删除引号后,整个here-doc将被视为双引号字符串,因此您需要转义任何可能会受参数扩展限制的内容。