如何在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")
关键修改点
- 生成配置时用单引号Here Document:
<<'EOF'会让Bash完全不解析文档内的变量和特殊字符,$uri会原封不动保留。 - 用占位符替换域名:因为单引号Here Document不会展开
$DOMAIN,所以先写占位符REPLACE_DOMAIN,再用sed替换成实际域名。 - 远程安全写入配置:通过
< <(echo "$CONFIG_CONTENT")把配置内容直接通过管道传给远程的cat > 文件,避免echo和单引号带来的解析问题,同时用sudo确保写入权限。
内容的提问来源于stack exchange,提问作者Artem
相关产品推荐
相关产品推荐

