provavelmente, o principal problema em ambos os casos é que o $variables
será expandido antes do desejado. Experimente
script=$(cat <<'END_OF_SCRIPT'
# your script goes here.
END_OF_SCRIPT
)
As aspas simples no primeiro END_OF_SCRIPT
basicamente citam o documento inteiro aqui.
Em seguida, é muito importante citar $script
sempre que você usá-lo:
echo "$script" > some_file
Caso contrário, todas as sequências de espaços em branco, incluindo novas linhas, serão reduzidas a um único espaço.