我在 bash 变量替换方面遇到问题。这是我正在尝试做的一个愚蠢的例子。我需要从 bash 脚本输出一个新脚本。一行(参见echo
我的示例)混合了不应替换的变量和应替换的变量。
#!/bin/bash
REPLACE=`whoami`
cat << EOF > mynewscript.sh
read DONTREPLACE < /home/$REPLACE/localinput.txt
echo $DONTREPLACE > /home/$REPLACE/somefile.log
EOF
exit 0
这不是一个真实的例子,但它确实说明了问题。假设我需要提前知道绝对路径,并且我希望在原始脚本中评估 $REPLACE。但我不希望在我的脚本中评估/替换 $DONTREPLACE 。$DONTREPLACE
应该与新脚本的输出完全相同。
因此,在制作此处文档时引用“EOF”是行不通的。
我希望我能很好地解释这一点。
我不知道还有其他解决方案。我很欣赏任何想法,但我更喜欢非常简单的想法/解决方案。它不必很优雅。
答案1
您应该使用\
来转义$
前面的DONOTREPLACE
。请参阅下面的示例和输出
REPLACE=10
DONOTREPLACE=20
cat <<EOF
> echo $REPLACE
> echo \$DONOTREPLACE
> EOF
echo 10
echo $DONOTREPLACE
答案2
我认为,如果您使用 bash,更好的解决方案是转义“EOF”标记。像这样:
cat > mytest << \EOF
$HOME
EOF
cat mytest
$HOME