Você pode fazer algo como:
eval "cat << __end_of_template__
$(sed 's/[\$']/\&/g;s/<%= @\([^ ]*\) %>/${}/g' < template)
__end_of_template__"
Ou seja, o sed substitui todos os <%= @xxx %> por ${xxx} depois de ter escapado todos os caracteres $ , \ e ' e deixe o shell fazer a expansão.
Ou se você não pode garantir que template não contenha uma linha __end_of_template__ :
eval "cut -c2- << x
$(sed 's/[\$']/\&/g;s/<%= @\([^ ]*\) %>/${}/g;s/^/y/' < template)
x"