Как передать переменные в HEREDOC в Bash?

16

Я хочу сделать что-то вроде этого:

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

$ cat test
My name is John

Есть идеи?

ChocoDeveloper
источник

Ответы:

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

или даже

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

Работал на меня.

Похоже, когда вы берете ==endв 'переменную не заменяет.

ах, вот оно на странице руководства (смотрите 3.6.6):

Формат здесь-документов:

      <<[-]word
              here-document
      delimiter

Для слова не выполняется расширение параметров, подстановка команд, арифметическое расширение или расширение имени пути . Если какие-либо символы в слове заключены в кавычки, разделитель является результатом удаления кавычек в слове, а строки в документе здесь не раскрываются. Если слово не заключено в кавычки, все строки здесь-документа подвергаются расширению параметров, подстановке команд и арифметическому расширению. [...]

порыв
источник
Вы также можете использовать двойные кавычки ( cat << "==end" > test), но жесткие кавычки действительно предотвращают подстановку.
Мат