Wie übergebe ich Variablen in Bash an ein HEREDOC?

16

Ich möchte so etwas machen:

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

$ cat test
My name is John

Irgendwelche Ideen?

ChocoDeveloper
quelle

Antworten:

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

oder auch

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

Hat für mich gearbeitet.

Sieht so aus, als würde ==enddie 'Variable nicht ersetzt.

ah, hier ist es in der Manpage (siehe 3.6.6):

Das Format der Here-Dokumente ist:

      <<[-]word
              here-document
      delimiter

Für Word wird keine Parametererweiterung, Befehlssubstitution, arithmetische Erweiterung oder Pfadnamenerweiterung durchgeführt . Wenn Zeichen in Wörtern in Anführungszeichen gesetzt werden, ist das Trennzeichen das Ergebnis der Entfernung von Anführungszeichen in Word, und die Zeilen im Dokument hier werden nicht erweitert. Wenn das Wort nicht in Anführungszeichen gesetzt ist, werden alle Zeilen des hier beschriebenen Dokuments einer Parametererweiterung, einer Befehlssubstitution und einer arithmetischen Erweiterung unterzogen. [...]

eilen
quelle
Sie können auch doppelte Anführungszeichen ( cat << "==end" > test) verwenden, aber harte Anführungszeichen verhindern tatsächlich die Substitution.
Mat