如何避免heredoc扩展变量? [复制]

2024-03-08

我正在尝试使用 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
"

其结果并不好myvariable_final不会被转义并替换为 init 脚本依赖项($remote_fs、$syslog、$network、$time)

#!/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
"

只需使用'EOF'防止变量扩展:

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

From man bash:

这里的文件

这种类型的重定向指示 shell 从 当前源直到仅包含定界符的行(没有 看到尾随空白)。到该点为止读取的所有行都是 然后用作命令的标准输入。

这里文档的格式是:

      <<[-]word
              here-document
      delimiter

无参数扩展、命令替换、算术扩展、 或对 word 执行路径名扩展。如果word中有任何字符 被引用,分隔符是对单词去除引号的结果,并且 此处文档中的行未展开。如果单词是 不加引号,此处文档的所有行均受参数影响 扩展、命令替换和算术扩展。在里面 后一种情况,字符序列\<newline>被忽略,并且\必须用于引用字符\, $, and `.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免heredoc扩展变量? [复制] 的相关文章

随机推荐