Bash
Bash腳本:包含“$”字元的文件中的多行
我正在編寫一個腳本來自動安裝一些東西,包括 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。