27

I'm working with a bash script trying to stop it from attempting to replace variables inside my heredoc. How do set a heredoc to either A) escape the variable names instead of parsing them or B) return the entire string untouched?

cat > /etc/nginx/sites-available/default_php <<END
server {
    listen 80 default;
    server_name _;
    root /var/www/$host; <--- $host is a problem child
}
END

As is, when I it finishes injecting it into a file I'm left with this:

server {
    listen 80 default;
    server_name _;
    root /var/www/;
}
38

From the bash(1) man page:

If any characters in word are quoted, the delimiter is the result of quote removal on word, and the lines in the here-document are not expanded.

cat > /etc/nginx/sites-available/default_php <<"END"
4
  • 3
    +1 Escaping the "limit string" also works (\END). See also tldp.org/LDP/abs/html/here-docs.html#EX71C – John McCarthy May 9 '13 at 18:17
  • Single quotes work too – Joao Costa May 14 '15 at 9:22
  • Same mechanism works for Korn shell (ksh). – jhfrontz Oct 2 '15 at 20:17
  • It's worth noting that whilst this answers the second option in the OP's question, it doesn't answer the question title. Visitors here might be looking to answer the first option, where they still need some expansion, in which case they should use the answer by @halfgaar. This answer is still very useful of course, and clearly did serve the OP's purpose. – spikyjt Nov 2 '20 at 16:57
28

Just with a backslash:

cat > /tmp/boeboe <<END
server {
    listen 80 default;
    server_name _;
    root /var/www/\$host';
}
END
2
  • Do you know how to disable injection of variable values without escaping each one? – Xeoncross Jun 16 '12 at 15:59
  • 2
    What Ignacio said, but I didn't know that :) – Halfgaar Jun 17 '12 at 6:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.