You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash脚本中输出$符号?$uri无法显示求助

修复Bash脚本中Nginx配置$符号丢失问题

问题原因

你的脚本存在两次特殊字符解析导致$uri丢失:

  • 生成CONFIG_CONTENT时,未加引号的Here Document(<<EOF)会解析\$uri为$uri,如果本地无uri变量,该变量会被替换为空字符串。
  • 远程执行命令时,echo '$CONFIG_CONTENT'的写法会让远程shell尝试解析内容中的$符号,进一步破坏配置。

修复后的完整脚本

#!/bin/bash

SERVER_IP=""
PASSWORD=""
DOMAIN=""

# 用单引号包裹EOF,避免本地解析$符号和变量
CONFIG_CONTENT=$(cat <<'EOF'

server {
    listen 80;
    listen [::]:80;

    root /home/webmas/REPLACE_DOMAIN;

    index index.php index.html index.htm index.nginx-debian.html;

    server_name REPLACE_DOMAIN;

    location / {
            try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /\.ht {
            deny all;
    }
}

EOF
)

# 替换配置中的域名占位符
CONFIG_CONTENT=$(echo "$CONFIG_CONTENT" | sed "s/REPLACE_DOMAIN/$DOMAIN/g")

# 远程执行:通过管道传递配置内容,避免多次解析
ssh -tt -p 300 webmas@$SERVER_IP <<EOF
mkdir -p $DOMAIN
echo -n "$PASSWORD" | sudo -S sh -c 'cat > /etc/nginx/sites-available/$DOMAIN'
EOF < <(echo "$CONFIG_CONTENT")

关键修改点

  1. 生成配置时用单引号Here Document:<<'EOF'会让Bash完全不解析文档内的变量和特殊字符,$uri会原封不动保留。
  2. 用占位符替换域名:因为单引号Here Document不会展开$DOMAIN,所以先写占位符REPLACE_DOMAIN,再用sed替换成实际域名。
  3. 远程安全写入配置:通过< <(echo "$CONFIG_CONTENT")把配置内容直接通过管道传给远程的cat > 文件,避免echo和单引号带来的解析问题,同时用sudo确保写入权限。

内容的提问来源于stack exchange,提问作者Artem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:32:44