Crie um script a partir do Bash Script usando o here-document; Por que minha variável é substituída?

6

Eu tenho um problema ao criar um script de um mestre:

Tão simples quanto:

cat  pippo << EOF
LOGFILE=test.log    
echo '#############################' >> $LOGFILE
EOF

Mas, quando eu inspeciono pippo eu fico:

LOGFILE=test.log
echo '#############################' >>
EOF

Por que o $ LOGFILE foi substituído?

    
por giuseppe 12.12.2016 / 13:12

2 respostas

10

Aqui, documente por padrão assuntos para expansões de shell, precisamente expansão de parâmetros, substituição de comando e expansão aritmética. Assim, a expansão variável (parâmetro) está acontecendo no seu caso - a variável LOGFILE está sendo expandida no shell atual, e como a variável presumivelmente não existe, portanto, null está sendo retornado (e substituído) como o valor expandido.

Para obter os metacaracteres do shell literalmente em um doc aqui, use aspas ao redor da string terminadora:

cat pippo <<'EOF'  ## "EOF" would do too
LOGFILE=test.log    
echo '#############################' >>"$LOGFILE"
EOF

Também cite a expansão da variável como (presumivelmente) se refere a um nome de arquivo, de modo que a divisão de palavras e a expansão do nome de caminho não sejam feitas após a expansão.

    
por 12.12.2016 / 13:37
0

Para realmente ter um arquivo pippo , você precisa fazer:

cat > pippo <<EOF

Que redireciona os valores no documento here para o arquivo chamado pippo .

Em seguida, para que o conteúdo dentro do aqui-doc seja canalizado exatamente como foi escrito e não expandido, avaliado ou alterado, é necessário citar a palavra após o << .
Qualquer um desses (até mesmo aspas parciais funcionam):

<<'EOF'
<<"EOF"
<<\EOF
<<E"O"F
<<E\OF

Se não houver cotação, o valor da variável "$LOGFILE" será expandido para seu valor, que parece ser nulo em seu ambiente, e será perdido.

Em suma, use algo assim:

cat > pippo << \_EOF_
LOGFILE=test.log    
echo '#############################' >> $LOGFILE
_EOF_
    
por 12.12.2016 / 22:09