Você deve citar o marcador End-Of-File, ou seja, a expansão da variável (ou melhor, tudo começando com $ , irá obter o contexto atual.
Compare:
hi=here
cat >file.sh <<EOF
#!/bin/sh
hi=there
echo $hi
EOF
sh file.sh
(saídas here )
hi=here
cat >file.sh <<\EOF
#!/bin/sh
hi=there
echo $hi
EOF
sh file.sh
saídas de there
hi=here
cat >file.sh <<'EOF'
#!/bin/sh
hi=there
echo $hi
EOF
sh file.sh
saídas de there .
Como alternativa, você pode citar o $ :
hi=here
cat >file.sh <<EOF
#!/bin/sh
hi=there
echo \$hi
EOF
sh file.sh
(saídas there )
Este comportamento inicialmente surpreendente é muito útil quando existe a necessidade de gerar scripts ligeiramente diferentes para várias finalidades.