您如何在Heredoc中转义字符?


22

我正在使用bash脚本,试图阻止它尝试替换Heredoc中的变量。如何将Heredoc设置为A)逸出变量名称而不是解析它们,或者B)完整返回整个字符串?

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

照原样,当我完成将其注入文件时,我将得到以下结果:

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

Answers:


33

bash(1)手册页:

如果word中的任何字符都用引号引起来,则 定界符是对word删除引号的结果,并且here-document中的行不会扩展。

cat > /etc/nginx/sites-available/default_php <<"END"

3
+1转义“限制字符串”也有效(\END)。另请参阅tldp.org/LDP/abs/html/here-docs.html#EX71C
John McCarthy,

单引号也起作用
Joao Costa

相同的机制适用于Korn Shell(ksh)。
jhfrontz

19

只需加上一个反斜杠:

cat > /tmp/boeboe <<END
server {
    listen 80 default;
    server_name _;
    root /var/www/\$host';
}
END

您知道如何在不转义每个变量的情况下禁用变量值的注入吗?
Xeoncross 2012年

2
伊格纳西奥说了什么,但我不知道:)
Halfgaar 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.