変数をcatに渡す

変数をcatに渡す

bash スクリプトには変数が 1 つだけあり${PHP_V}、次のように nginx 構成ファイルに渡そうとしています。

cat <<'EOF' > /etc/nginx/sites-available/default
server {
    listen 80 default_server; 
    listen [::]:80 default_server; 

    listen 443 ssl default_server; 
    listen [::]:443 ssl default_server; 

    root /vagrant/webroot; 

    index index.php; 

    server_name _; 

    ssl_certificate /etc/nginx/certs/vagrantbox.crt; 
    ssl_certificate_key /etc/nginx/certs/vagrantbox.key;  

    location / { 
        try_files $uri $uri/ /index.php?$args; 
    } 

    location ~ \.php$ { 
        try_files $uri =404; 
        include fastcgi_params; 
        fastcgi_pass unix:/run/php/php${PHP_V}-fpm.sock; 
        fastcgi_index index.php; 
        fastcgi_intercept_errors on; 
        fastcgi_param SCRIPT_FILENAME 
        $document_root$fastcgi_script_name; 
    }
}
EOF

しかし、成功しませんでした。どうすればいいでしょうか?

答え1

引用符を解除する必要がありますEOF:

単語の一部が引用符で囲まれている場合、区切り文字は単語に対して引用符の削除を実行することによって形成され、ヒアドキュメント行は展開されません。それ以外の場合、区切り文字は単語自体になります。

word のどの部分も引用符で囲まれていない場合、here-document のすべての行は、パラメータ展開、コマンド置換、および算術展開のために展開されます。

見る :2.7.4 ヒアドキュメント


ただし、ヒアドキュメントには、拡張を防ぐために個別にエスケープする必要があるものがいくつかあります。

cat <<EOF > /etc/nginx/sites-available/default
server {
    listen 80 default_server; 
    listen [::]:80 default_server; 

    listen 443 ssl default_server; 
    listen [::]:443 ssl default_server; 

    root /vagrant/webroot; 

    index index.php; 

    server_name _; 

    ssl_certificate /etc/nginx/certs/vagrantbox.crt; 
    ssl_certificate_key /etc/nginx/certs/vagrantbox.key;  

    location / { 
        try_files \$uri \$uri/ /index.php?\$args; 
    } 

    location ~ \.php\$ { 
        try_files \$uri =404; 
        include fastcgi_params; 
        fastcgi_pass unix:/run/php/php${PHP_V}-fpm.sock; 
        fastcgi_index index.php; 
        fastcgi_intercept_errors on; 
        fastcgi_param SCRIPT_FILENAME 
        \$document_root\$fastcgi_script_name; 
    }
}
EOF

関連情報