db1="community-service-data"
db2="ecomm-data-test"
drop_db="DROP DATABASE ${db1}"
sudo -u postgres -S /bin/bash -c "psql -U postgres -d postgres -c \"${drop_db}\""
drop_db="DROP DATABASE \"ecomm-data-test\";"
sudo -u postgres -S /bin/bash -c "psql -U postgres -d postgres -c \"${drop_db}\""
错误
ERROR: syntax error at or near "-"
LINE 1: DROP DATABASE community-service-data
^
我的数据库名称中有连字符。我正在从 bash 脚本中删除这些数据库。它一直抱怨变量中的“-”。我试过引用,但没有用。我甚至试过drop_db="DROP DATABASE \"${db1}\""
如果我直接在 psql 命令行中用引号引起来,它就会起作用。
我怎样才能正确地做到这一点。
谢谢
更新:
drop_db=(DROP DATABASE "${db1}")
错误:
ERROR: syntax error at end of input
LINE 1: DROP
^
这里的复杂性在于 Postgres 要求数据库名称用双引号引起来。您还调用了额外的一层 shell。请尝试以下方法:
然后
或者
您说该片段是较大脚本的一部分。如果脚本的大部分内容应该在 下运行,
sudo -u postgres
则在脚本中创建一个单独的函数,该函数仅在提供标志时才调用,然后捕获该函数以单独运行。例如,在 下sudo -u postgres /path/to/my/script -P
,-P
调用函数的标志在哪里这里不需要
sudo
或bash
。postgresql
带有一个独立的dropdb
可执行文件来删除数据库,而像 zsh 这样的更高级的 shell 可以自己s
执行u
ser 和其他操作:do
dropdb
无论数据库名称包含什么字符,都会构造正确的 SQL 命令。仅将值括在里面
"
对于任意值都不起作用。显然,它对于包含的值不起作用"
,但它也可能因编码冲突而失败。如果使用
psql
,最好通过 psql 变量传递值:也可以写成(仍然在 zsh 中):
¹尽管您必须确保它使用与 相同的字符集进行编码
dropdb
;PGCLIENTENCODING
如果需要,请查看变量以进行更改。