Home > Enterprise >  How to process or excape variables inside of EOF to write file content?
How to process or excape variables inside of EOF to write file content?

Time:10-09

This is how I create a file (nginx.conf) via shell. As there are $ characters in the filecontent I'm using EOF.

if [ $type == "nginx" ]; then
    cat > ${path}/nginx.conf <<'EOF'
server {
listen 3000;

location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
    try_files $uri $uri/ /index.html =404;
}

include /etc/nginx/extra-conf.d/*.conf;
}
EOF
fi

Now I have to use a dynamic port value, so instead of listen 3000 I need to use listen $port. But this won't work, as in the content there is also $uri, which should be handled as text, not as a variable.

CodePudding user response:

Using only the delimiter itself, either all parameters are expanded or none. You'll have to allow expansion, but escape the dollar signs for $uri to inhibit their expansion.

if [ "$type" = "nginx" ]; then
    cat > "${path}/nginx.conf" <<EOF
server {
listen $port;

location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
    try_files \$uri \$uri/ /index.html = 404;
}

include /etc/nginx/extra-conf.d/*.conf;
}
EOF
fi

The here document behaves like a double-quoted string:

$ foo=bar
$ echo "$foo"
bar
$ echo "\$foo"
$foo
  • Related