如何避免 herdoc 扩展变量?

我正在尝试使用来自 ENV 的替换字符串创建一个脚本文件,但也想防止一些转义

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
"

其结果是不好的,因为没有转义 我的变量 _ final,而是将其替换为 init 脚本依赖项($remote _ fs、 $syslog、 $network、 $time)中的 我的变量 _ final

#!/bin/bash


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

如果我试着在美元 $后面放一个反斜杠 \,我可以避免替换,但是我得到了一个不想要的反斜杠 \:

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
"

结果:

#!/bin/bash


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

需要/出席的结果应该是:

#!/bin/bash


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

如下所示,在 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
"
49264 次浏览

在使用 su 命令时,将命令本身放在单引号中,并用反斜杠转义 $。占位符变量必须在命令 bash 上下文中设置(在 su 之后)。所以你需要做

su -c 'ph="ph"; cat << EOF > script
varinscript=$ph
var=\${var}
EOF'

只要使用 'EOF'就可以防止变量膨胀:

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

From man bash:

此处文件

这种类型的重定向指示 shell 从 直到只包含分隔符的行为止 后面的空格)可以看到。到该点为止的所有行都是 然后用作命令的标准输入。

The format of here-documents is:

      <<[-]word
here-document
delimiter

没有参数展开,指令替代,算术展开, 或路径名扩展在 word 中执行。如果 word 中有任何字符 则分隔符是单词上引号移除的结果,并且 Here-document 中的行没有展开。 < strong > If word is 如果没有引号,则此处文档的所有行都受到参数的限制 扩展、指令替代和算术扩展 后一种情况下,字符序列 \<newline>被忽略,而 \ 必须用于引用字符 \$`