Você deve usar \
para escapar do $
na frente de DONOTREPLACE
. Veja o exemplo e a saída abaixo
REPLACE=10
DONOTREPLACE=20
cat <<EOF
> echo $REPLACE
> echo \$DONOTREPLACE
> EOF
echo 10
echo $DONOTREPLACE
Estou tendo um problema com a substituição de variáveis bash. Aqui está um exemplo bobo do que estou tentando fazer. Eu preciso produzir um novo script a partir de um script bash. Uma linha (veja echo
no meu exemplo) tem uma mistura de variáveis que não devem ser substituídas e variáveis que devem ser substituídas.
#!/bin/bash
REPLACE='whoami'
cat << EOF > mynewscript.sh
read DONTREPLACE < /home/$REPLACE/localinput.txt
echo $DONTREPLACE > /home/$REPLACE/somefile.log
EOF
exit 0
Este não é um exemplo real, mas ilustra o problema. Digamos que eu precise saber o caminho absoluto com antecedência e que eu queira $ REPLACE avaliado no meu script original. Mas eu não quero $ DONTREPLACE avaliado / substituído no meu script. $DONTREPLACE
deve ser enviado exatamente assim para o novo script.
Portanto, citar 'EOF' ao criar o documento aqui não funciona.
Espero que eu esteja explicando isso bem o suficiente.
Eu não sei de outra solução. Eu aprecio todas as ideias, mas prefiro idéias / soluções realmente simples. Não precisa ser elegante.
Eu acho que uma solução melhor, se você estiver usando bash é escapar do marcador "EOF". Assim:
cat > mytest << \EOF
$HOME
EOF
cat mytest
$HOME