如何处理或逃避 EOF 内部的变量以写入文件内容?

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

这就是我通过 shell 创建文件 (nginx.conf) 的方式。 由于文件内容中有 $ 个字符,我使用 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

现在我必须使用动态端口值,所以我需要使用 listen $port 而不是 listen 3000。 但这行不通,因为在内容中还有$uri,应该作为文本处理,而不是作为变量处理。

仅使用定界符本身,扩展所有参数或none。您必须允许扩展,但转义 $uri 的美元符号以抑制其扩展。

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

此处文档的行为类似于双引号字符串:

$ foo=bar
$ echo "$foo"
bar
$ echo "$foo"
$foo