次のコードを考えてみましょう。
for domain; do
cat << EOF > "/etc/nginx/sites-available/${domain}.conf"
My \domain is ${domain}.
EOF
done
パスは/etc/nginx/sites-available/${domain}.conf
引用符で囲まれています。これはベストプラクティスですか、それとも変数置換のために行われましたか?変数置換の場合、EOF
区切り文字名()をラップする方が良いか、より一般的ではありませんか?
答え1
含む変数を参照する式は次のとおりです。ベストプラクティス(単純な人になるよりも習慣) 部分なぜなら変数拡張:
たとえば、変数がスペースを含む文字列に展開されると、コードは誤ったファイルに書き込まれます。 heredocキーワードを引用すると変数の拡張に影響しますが、引用が文字列に影響を与えるのと同じ方法ではありません。
特にheredocキーワードを引用すると、変数の拡張が防止されます。
とにかく問題のパスはheredocの本文の一部ではありません(行から始まります)。後ろにしたがって、最初の区切り文字)は影響を受けません。独立して引用する必要があります。
また、あなたの質問に関係なく、コードスニペットのheredocは閉じた区切り文字がインデントされているため無効です。次の抜粋を考えてみましょう高度なバッシュスクリプトガイド:
閉幕式制限文字列ここで、ドキュメントの最後の行は次から始める必要があります。最初キャラクターの位置。することができます先行スペースなし。文字列の後のスペースを制限すると、予期しない動作が発生する可能性があります。空白のため、制限された文字列は認識されません。
ここで例外は<<-
スタイルheredocsです。このスタイルはタブのインデントを無視し、閉じる区切り文字のタブのインデントも許可します。これについては、次の段落で抜粋して説明します。ウルウィッチカーニバルウィキ:
<<-END
代わりにHeredoc演算子として使用すると、<<END
Bashはコマンドに送信する前にHeredocコンテンツの各行の先頭にあるすべてのタブを削除します。これにより、タブ(空白ではない)を使用してHeredocコンテンツと残りのコードをインデントできます。このタブは Heredoc を受信するコマンドには送信されません。タブを使用してセンチナル文字列をインデントすることもできます。