Variável não interpretada com 'EOF'

2

Este é o meu script:

var="lalallalal"
tee file.tex <<'EOF'
text \ text \
$var
EOF

Preciso usar 'EOF' (com aspas) porque eu não posso usar barra dupla ( // ) caso contrário.

No entanto, se eu usar as aspas, a variável $var não será expandida.

    
por Marcus 19.07.2017 / 18:20

2 respostas

2

Se você citar EOF , as variáveis não serão expandidas, como você descobriu. Isso está documentado na seção Documentos aqui de man bash :

   No parameter and variable expansion, command  substitution,  arithmetic
   expansion,  or pathname expansion is performed on word.  If any part of
   word is quoted, the delimiter is the result of quote removal  on  word,
   and  the  lines  in  the  here-document  are  not expanded.  If word is
   unquoted, all lines of the here-document  are  subjected  to  parameter
   expansion,  command substitution, and arithmetic expansion, the charac‐
   ter sequence \<newline> is ignored, and \ must be  used  to  quote  the
   characters \, $, and '.

A outra coisa explicada é que você ainda pode usar \ , você só precisa escapar: \ . Então, como você quer dois \ , você precisa escapar de cada um deles: \\ . Colocando tudo isso junto:

#!/bin/bash
var="lalallalal"
tee file.tex <<EOF
text \\ text \\
$var
EOF
    
por 19.07.2017 / 18:25
0

Parece que você deseja ativar a expansão apenas para parte do documento ou apenas para alguns caracteres especiais ( $ yes, \ no). No primeiro caso, você pode querer dividir here-document em dois, e no segundo caso, deixe-me propor uma abordagem não-padrão: treat \ como uma variável:

var="lalallalal"
bs='\';                       #backslash
tee file.tex <<EOF
text $bs$bs text $bs$bs
$var
EOF
    
por 19.07.2017 / 18:38