Jak przekazać zmienne do HEREDOC w bash?

15

Chcę zrobić coś takiego:

$ NAME=John
$ cat << '==end' > test
My name is $NAME
==end

$ cat test
My name is John

Jakieś pomysły?

ChocoDeveloper
źródło

Odpowiedzi:

23
cat <<EOF > test
My name is $NAME
EOF

lub nawet

cat <<==end > test
My name is $NAME
==end

Pracował dla mnie.

Wygląda na to, jeśli wziąć ==endw 'zmiennej nie zastępuje.

ah, oto strona man (patrz 3.6.6):

Format dokumentów tutaj to:

      <<[-]word
              here-document
      delimiter

Na słowie nie jest wykonywana interpretacja parametrów, podstawianie poleceń, interpretacja arytmetyczna ani interpretacja nazw ścieżek . Jeśli cytowane są jakiekolwiek znaki w słowie , separator jest wynikiem usunięcia cudzysłowu w słowie, a wiersze w niniejszym dokumencie nie są rozwijane. Jeśli słowo nie jest cytowane, wszystkie wiersze dokumentu tutaj podlegają interpretacji parametrów, podstawianiu poleceń i interpretacji arytmetycznej. [...]

pośpiech
źródło
Możesz także użyć podwójnych cudzysłowów ( cat << "==end" > test), ale twarde cudzysłowy rzeczywiście uniemożliwiają podstawienie.
Mat