Bash

Bash腳本:包含“$”字元的文件中的多行

  • May 19, 2021

我正在編寫一個腳本來自動安裝一些東西,包括 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;

請問如何防止這種行為?我嘗試使用引號,但沒有用。

謝謝 :)

如果您不想在此處的文件(<<EOL構造的輸入)中進行任何替換,請在分隔符規範中使用引號。任何引用都可以:您可以寫<<'EOL'(推薦)<<\EOL,,,<<E''OL等等,甚至(令人困惑)<<"EOL"

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

如果您有時想擴展變數和命令替換,請<<EOL在不想擴展的每個特殊字元之前保留並放置一個反斜杠。需要轉義的特殊字元是`$``.

請參閱有關此處文件的 bash 手冊。這也適用於普通 sh。

引用自:https://unix.stackexchange.com/questions/650463