如何通过Bash脚本执行命令创建PSQL用户并解决引号嵌套问题
问题原因
你的命令失效的核心确实是引号嵌套解析错误:bash -c 的参数外层使用了单引号,内部 psql -c 的参数用了双引号,到密码前的双引号时就已经提前闭合了 psql 的参数引号,qwerty 直接变成了bash层面的独立字符串,整个命令解析完全不符合预期。
可行的实现方案
方案1:最简写法(无多余嵌套)
无需额外套一层bash -c,直接用sudo切换用户后执行psql,用heredoc传入SQL语句,完全避免引号冲突:
sudo -H -u postgres psql <<EOF CREATE USER admin WITH PASSWORD 'qwerty'; EOF
方案2:保留bash -c结构(适合多命令场景)
如果确实需要在bash -c里执行多条命令,可以用双引号包裹外层参数,内部双引号加反斜杠转义:
sudo -H -u postgres bash -c "psql -c \"CREATE USER admin WITH PASSWORD 'qwerty';\""
也可以用bash单引号嵌套的标准写法'\''处理内部引号:
sudo -H -u postgres bash -c 'psql -c "CREATE USER admin WITH PASSWORD '\''qwerty'\'';"'
方案3:安全传参写法(适配含特殊字符的密码)
如果密码包含单引号、反斜杠等特殊字符,推荐用psql变量传递的写法,既避免引号冲突也能防范SQL注入风险:
DB_PASS="你的自定义密码" sudo -H -u postgres psql -v dbpass="$DB_PASS" <<EOF CREATE USER admin WITH PASSWORD :'dbpass'; EOF
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

