How to avoid heredoc expanding variables? [duplicate] Ask Question

How to avoid heredoc expanding variables? [duplicate] Ask Question

I'm trying to create a script file using substitution string from ENV but want also to prevent some from escaping

export PLACEHOLDER1="myPlaceholder1Value"
sudo /bin/su -c "cat << EOF > /etc/init.d/my-script
#!/bin/bash

myvariable_1=toto$PLACEHOLDER1
myvariable_final=\"dynamicvar=\${myvariable_1},\${myvariable_2}\"
EOF
"

It results in which is not good as the myvariable_final are not escaped and substituted as the one from the init script dependencies ($remote_fs, $syslog, $network, $time)

#!/bin/bash

myvariable_1=totomyPlaceholder1Value
myvariable_2=titimyPlaceholder2Value
myvariable_final="dynamicvar=,"

If i try to put a backslash \ behind the dollars $, I manage to avoid the substitution but I getting an unwanted backslash \:

export PLACEHOLDER1="myPlaceholder1Value"
export PLACEHOLDER2="myPlaceholder2Value"
sudo /bin/su -c "cat << EOF > /etc/init.d/my-script
#!/bin/bash

myvariable_1=toto$PLACEHOLDER1
myvariable_2=titi$PLACEHOLDER2
myvariable_final=\"dynamicvar=\$\{myvariable_1},\$\{myvariable_2}\"
EOF
"

results in:

#!/bin/bash

myvariable_1=totomyPlaceholder1Value
myvariable_2=titimyPlaceholder2Value
myvariable_final="dynamicvar=$\{myvariable_1},$\{myvariable_2}"

Wanted/attended result whould have been :

#!/bin/bash

myvariable_1=totomyPlaceholder1Value
myvariable_2=titimyPlaceholder2Value
myvariable_final="dynamicvar=${myvariable_1},${myvariable_2}"

solved by putting quote around the EOF以下のように、必要に応じてバックスラッシュを使用してエスケープを制御します。

export PLACEHOLDER1="myPlaceholder1Value"
export PLACEHOLDER2="myPlaceholder2Value"
sudo /bin/su -c "cat << 'EOF' > /etc/init.d/my-script
#!/bin/bash

myvariable_1=toto$PLACEHOLDER1
myvariable_2=titi$PLACEHOLDER2
myvariable_final=\"dynamicvar=\${myvariable_1},\${myvariable_2}\"
EOF
"

ベストアンサー1

'EOF'変数が拡張されないようにするには、次のように使用します。

sudo /bin/su -c "cat << 'EOF' > /etc/init.d/my-script
#                       ^   ^
... contents go here
EOF

からman bash

ヒアドキュメント

このタイプのリダイレクトは、区切り文字のみを含む行(末尾の空白なし)が見つかるまで、現在のソースから入力を読み取るようにシェルに指示します。その時点までに読み取られたすべての行は、コマンドの標準入力として使用されます。

ヒアドキュメントの形式は次のとおりです。

      <<[-]word
              here-document
      delimiter

word に対しては、パラメータ展開、コマンド置換、算術展開、またはパス名展開は実行されません。word 内のいずれかの文字が引用符で囲まれている場合、区切り文字は word から引用符を削除した結果であり、ヒアドキュメント内の行は展開されません。wordが引用符で囲まれていない場合、ヒアドキュメントのすべての行はパラメータ展開、コマンド置換、および算術展開の対象となります。後者の場合、文字シーケンスは\<newline>無視され、、、および の文字\を引用符で囲むために使用する必要があります\$`

おすすめ記事