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

ただし、 と に 2 つの bash 変数が$WEBAPPあり$APPFOLDERます。それらは、私が意図したものではなくexample.com、ファイル内とまったく同じように明示されています。abcapp

スクリプトを意図したとおりに動作させるにはどうすればよいですか?

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

2 番目の例の using<<ENDOFCONTENTは、$VARs をその値に置き換える必要があることを示しており<<'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 に答える