A construção <<
apresenta um documento aqui que é tratado
como se fosse uma string de aspas duplas à medida que é lida, então as variáveis se expandem
imediatamente como eles são lidos pelo shell. Você veria isso claramente
se você habilitar um recurso de shell que informa sobre variáveis indefinidas.
Vou usar esse recurso no shell BASH aqui:
$ set -o nounset
$ echo "$a"
bash: a: unbound variable
$ bash <<EOF
> a=foo
> echo "$a"
> EOF
bash: a: unbound variable
Para impedir que o shell expanda variáveis no documento aqui como está sendo lido, você pode citar a tag ou barra invertida a cada uso da variável every :
$ bash <<'EOF'
> a=foo
> echo "$a"
> EOF
foo
$ bash <<EOF
> a=foo
> echo "\$a"
> EOF
foo
Observe que os tipos de citações usadas em torno da variável dentro dela documento não tem nada a ver com ou não a variável é expandida pelo shell como o documento aqui está sendo lido.
p.s. Sempre cite duas vezes suas expansões de variáveis para que elas não sejam Acione o nome do arquivo GLOB não intencional.
p.p.s. Ative a verificação da variável indefinida em suas conchas, para capturar seus erros de digitação. Isso teria lhe dado uma pista do seu problema.
p.p.p. Não use shells C para scripts. Eles têm muitos bugs e inconsistências