如何在Heredoc中转义$插值?附相关代码示例
嘿,这个问题我太熟悉了!在Bash的Heredoc里要阻止$符号被shell自动插值,有两个非常实用的方法,咱们一个个说:
方法1:给Heredoc分界符包裹单引号
这是最省心的做法——只要给你的USERDATA分界符加上单引号,整个Heredoc块里的所有$符号都会被当作普通文本处理,不会被shell解析成变量。修改后的代码长这样:
user_data = <<-'USERDATA' #!/bin/bash echo "server {" >> /etc/nginx/sites-available/site echo " listen 80;" >> /etc/nginx/sites-available/site echo " location / {" >> /etc/nginx/sites-available/site echo " proxy_set_header X-Forwarded-For $remote_addr;" >> /etc/nginx/sites-available/site echo " proxy_set_header Host $http_host;" >> /etc/nginx/sites-available/site echo " }" >> /etc/nginx/sites-available/site echo "}" >> /etc/nginx/sites-available/site USERDATA
注意哦,分界符-'USERDATA'里的单引号是直接加在分界符前后的,而且后面的结束分界符USERDATA不能有任何缩进(如果你的代码里有缩进的话,要确保结束符顶格写)。
方法2:逐个转义$符号
如果你只是想保留部分$符号,其他的还需要正常插值,那可以给每个需要保留的$前面加反斜杠\,把它转义成普通字符。比如这样修改:
user_data = <<-USERDATA #!/bin/bash echo "server {" >> /etc/nginx/sites-available/site echo " listen 80;" >> /etc/nginx/sites-available/site echo " location / {" >> /etc/nginx/sites-available/site echo " proxy_set_header X-Forwarded-For \$remote_addr;" >> /etc/nginx/sites-available/site echo " proxy_set_header Host \$http_host;" >> /etc/nginx/sites-available/site echo " }" >> /etc/nginx/sites-available/site echo "}" >> /etc/nginx/sites-available/site USERDATA
这种方式更灵活,适合混合场景——比如你可能在Heredoc里既有需要保留的$remote_addr,又有需要插值的shell变量,就可以用这个方法针对性转义。
两种方法都能解决你的问题,看你具体需求选就行啦~
内容的提问来源于stack exchange,提问作者user191152
相关产品推荐
相关产品推荐

