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在每个不想扩展的特殊字符之前保留并放置一个反斜杠。需要转义的特殊字符是$\`

请参阅 bash 手册这里的文件。这也适用于普通 sh。

相关内容