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>
無視され、、、および の文字\
を引用符で囲むために使用する必要があります\
。$
`