將路徑用引號括起來是最佳做法嗎?
考慮以下程式碼:
for domain; do cat << EOF > "/etc/nginx/sites-available/${domain}.conf" My \domain is ${domain}. EOF done
請注意,路徑
/etc/nginx/sites-available/${domain}.conf
用引號括起來。這是最佳實踐還是因為變數替換而完成?EOF
如果它是變數替換,那麼將heredoc名稱( )包裝起來不是更好或更常見嗎?
引用包含變數的表達式是一種最佳實踐(而不僅僅是一個約定),部分原因是變數擴展:
例如,如果變數擴展為包含空格的字元串,那麼您的程式碼最終會寫入錯誤的文件。引用 heredoc 關鍵字確實會影響變數擴展,但與引用影響字元串的方式不同:
具體來說,引用 heredoc 關鍵字可以防止變數擴展。
無論如何,有問題的路徑不是heredoc主體的一部分(從第一個分隔符之後的行開始),因此不會受到影響 - 它必須獨立引用。
另請注意(儘管這與您的問題無關)您的程式碼片段中的 heredoc 無效,因為結束分隔符是縮進的。考慮一下Advanced Bash-Scripting Guide的以下摘錄:
結束限製字元串,在 here 文件的最後一行,必須從第一個字元位置開始。不能有前導空格。限製字元串後的尾隨空格同樣會導致意外行為。空格可防止限製字元串被辨識。
例外情況是
<<-
heredocs 樣式,它忽略製表符縮進並且還允許結束分隔符以製表符縮進。這在取自Woolledge Bash Wiki的以下段落中進行了描述:如果您使用
<<-END
而不是<<END
作為 Heredoc 運算符,Bash 會在將 Heredoc 內容髮送到命令之前刪除每行開頭的所有製表符。這樣,您仍然可以使用製表符(但不能使用空格)將 Heredoc 內容與其餘程式碼一起縮進。這些選項卡不會發送到接收您的 Heredoc 的命令。您還可以使用製表符來縮進您的標記字元串。