首页 > 解决方案 > 如何使用 PSQL 客户端运行多个命令

问题描述

我一直在尝试通过 psql 客户端运行多个命令以连接到远程数据库并在一行中运行一些命令,但这似乎是不可能的?

我试图在命令下运行,它在执行第一个命令后给了我直接的错误。我在环境中设置了所有 bash 变量。

PGPASSWORD=${ADMIN_PASSWORD} psql -h ${REMOTE_HOST} -U postgres -d ${SOME_DATABASE} -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";' -c "CREATE USER '$DB_USER' WITH PASSWORD '${DB_PASSWORD}';" -c 'GRANT ALL PRIVILEGES ON DATABASE "${DB_DATABASE}" TO "${DB_USER}";'

当我运行它时,看起来只有第一个命令成功,我从 psql 帮助中阅读了指令-c, --command=COMMAND run only single command (SQL or internal) and exit

但是有没有办法利用 bash 管道或反斜杠以这种方式使用它?

标签: postgresqlpsql

解决方案


您那里有一个杂散的反斜杠,这肯定会弄乱东西。

-c "创建用户'$DB_USER'..."

用户名需要不加引号,或者用双引号引起来。不允许用单引号引用它。

-c 'GRANT ALL PRIVILEGES ON DATABASE "${DB_DATABASE}"...'

shell 变量替换不会发生在由最外层单引号引起来的字符串内,因此这是引用文字 string "${DB_DATABASE}"

如果您还需要文字双引号和变量替换,您可以使用单引号,但在变量之前停止它们,然后再拿起。或使用双引号,但转义文字双引号。(这个是带的bash,其他shell我不知道)

$ export foo=bar-baz
$ echo 'here is "'$foo'" within quotes'
here is "bar-baz" within quotes
$ echo "here is \"$foo\" within quotes"
here is "bar-baz" within quotes

推荐阅读