3

I want to write configuration information to a specific file which has dollar signs ($) inside. That seems to be a problem.

Here's what I did:

$ cat >> /etc/nginx/nginx.conf <<EOF
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user              nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;

pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    ## Detect when HTTPS is used
    map $scheme $https {
      default off;
      https on;
    }
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    # Load config files from the /etc/nginx/conf.d directory
    # The default server is in conf.d/default.conf
    include /etc/nginx/conf.d/*.conf;

}
EOF

How can I solve this?

2 Answers 2

8

Quote EOF:

$ var=foo
$ cat << EOF
> $var
> EOF
foo
$ cat << 'EOF'
> $var
> EOF
$var

From man bash:

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.

5
  • Thanks it works. Could you explain what the 'EOF' doe exactly? Thanks
    – TheNiceGuy
    Commented Dec 8, 2013 at 23:21
  • 2
    @Michael - It's just the delimiter that indicates the end of the heredoc. You could just as validly use FOO, and end the heredoc with FOO on a line by itself.
    – Chris Down
    Commented Dec 8, 2013 at 23:21
  • @Michael - please be sure to mark this as the accepted answer so that others know your issue's been resolved.
    – slm
    Commented Dec 8, 2013 at 23:55
  • I do not understand the purpose of such subtlety in bash. Is it by design? Could some one explain. Thanks.
    – Ketan
    Commented Dec 9, 2013 at 0:14
  • 1
    yes It is by design. If you want to use variables in your here-document you want one behavior, If you want simpler quoting you want another.
    – hildred
    Commented Dec 9, 2013 at 2:18
-3

Quote the EOF as a string literal . ' EOF ' .

cat << 'EOF' > foo
echo "$1"
EOF
bash foo hello

enter image description here

cat << 'EOF' > test
echo "First command line argument is : $1"
echo "Second command line argument is : $2"
echo "List of all command line arguments is: $@"
EOF
bash test hello world!

enter image description here

2
  • 2
    This is what the existing answer already says.
    – Kusalananda
    Commented Jan 6, 2020 at 8:03
  • Ok , i edited the other question .Thanks for bringing it to my attention that is what it was trying to say and do . Anyway it maybe good to elaborate as a bit of a tutorial to the very new people
    – abc
    Commented Jan 6, 2020 at 9:07

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .