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 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. 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. 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. 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. 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. 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 Commented Jan 6, 2020 at 9:07

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.