Bashスクリプト:Catファイルに「$」文字を含む複数行

Bashスクリプト:Catファイルに「$」文字を含む複数行

私はnginx Webサーバーを含むいくつかのインストールを自動化するスクリプトを書いています。

次のようにnginx confファイルを生成しています。

cat >/etc/nginx/sites-available/bookstack.conf <<EOL
server {
  listen 443 ssl;
  listen [::]:443 ssl;
  ssl_certificate /etc/nginx/certificats/domain.tld.crt;
  ssl_certificate_key /etc/nginx/certificats/domain.tld.key;
  ssl_protocols TLSv1.2 TLSv1.1 TLSv1;

  server_name domain.tld;

  root /path/to/bookstack/public;

  index index.php index.html;

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

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

server {
    listen 80;
    listen [::]:80;

    server_name domain.tld;

    return 302 https://$server_name$request_uri;
}

EOL

私の問題は、catが$文字を変数名として使用し(通常意味がある)、私が望むものを変数名に入れないことです。.conf文書。これは私のサンプルです。.confスクリプトが完了した後のファイル:

location / {
    try_files  / /index.php?;
  }

location ~ \.php$ {
    fastcgi_index index.php;
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME ;
    fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;

この動作を防ぐにはどうすればよいですか?引用符を使ってみましたが、成功しませんでした。

ありがとうございます:)

答え1

この文書(構成された入力)で代替操作を実行したくない場合は、<<EOL区切り記号の仕様に引用符を使用してください。どんな引用でも大丈夫です。<<'EOL'(推奨)、<<\EOLなどを書くこと<<E''OLも、(混乱しても)書くこともできます<<"EOL"

$ cat <<'EOL'
> $foo
> EOL
$foo

場合によっては、変数やコマンドの置換を拡張したい場合は、拡張したくない<<EOL各特殊文字の前にバックスラッシュを置いてください。エスケープする必要がある特殊文字はです$\`

バッシュマニュアルを参照してくださいここにファイル。これは通常のshでも機能します。

関連情報