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

shell脚本执行psql命令时引号转义错误无法传递变量问题

问题修复方案

错误原因

  • 原有写法的核心问题是两层引号嵌套的转义逻辑错误:
    1. 外层su -c使用双引号包裹参数时,双引号内部的单引号不需要加反斜杠转义,额外添加的\'会打乱命令结构
    2. 密码变量$password外层的单引号提前截断了psql -c的参数串,导致psql收到的命令语法不完整,且如果密码包含空格、特殊符号时还会出现注入风险。

可行写法

写法1:双引号嵌套转义(单行写法)

su postgres -c "/usr/bin/psql -c \"CREATE ROLE user WITH SUPERUSER LOGIN PASSWORD '$password';\""

逻辑说明:

  • 外层双引号保证$password变量可以正常展开
  • 内部转义的\"用来包裹psql -c的完整参数,避免语法断裂
  • 最内层的单引号用来包裹密码值,适配psql的SQL语法规则

写法2:HereDoc写法(更易维护,避免多层转义)

更推荐这种写法,不需要处理复杂的嵌套转义,可读性更高:

# 先处理密码中的单引号,避免SQL语法错误(postgresql中两个单引号表示一个字面单引号)
password=$(printf '%s' "$password" | sed "s/'/''/g")

su postgres <<EOF
/usr/bin/psql -c "CREATE ROLE user WITH SUPERUSER LOGIN PASSWORD '$password';"
EOF

额外注意

如果你的密码中可能包含单引号、反斜杠等特殊字符,务必提前对$password做转义处理,避免出现SQL语法错误或注入问题。

内容的提问来源于stack exchange,提问作者Artion Karreçi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:15:07