【发布时间】:2023-01-13 03:33:53
【问题描述】:
我正在尝试使用来自 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不会被转义并替换为初始化脚本依赖项($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}"
通过在周围加上引号来解决结束符如下所示,并在需要时使用反斜杠控制转义
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”需要引号!
-
如果你使用带引号的'EOF',它不会替换,但例如在我的例子中我需要一些变量被替换,一些环境变量不被转义。我们该怎么做。
标签: bash escaping substitution heredoc