shell脚本执行psql命令时引号转义错误无法传递变量问题
问题修复方案
错误原因
- 原有写法的核心问题是两层引号嵌套的转义逻辑错误:
- 外层
su -c使用双引号包裹参数时,双引号内部的单引号不需要加反斜杠转义,额外添加的\'会打乱命令结构 - 密码变量
$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
相关产品推荐
相关产品推荐

