如果 postgres .sh 文件中不存在则创建数据库

create db if not exists in postgres .sh file

我想在下面的 .sh 文件中执行这些行:

#!/bin/sh +x
sudo su postgres
psql -U postgres -tc "SELECT 1 FROM pg_database WHERE datname = 'test_db'" | grep -q 1 || psql -U postgres -c "CREATE DATABASE test_db"

但是只有'sudo su postgres'在执行,第二行没有执行。有人可以帮我执行这两行吗

我建议你更新你的 sudo 配置,这样你就可以直接表示你只需要作为 postgres 而不是 root:

sudo -u postgres ...

例如:

user host = (postgres) command

其中 user 是您的用户,host 是您希望此应用的主机名(ALL?),command 是您的命令的名称(ALL?)如果您不想,可以使用“NOPASSWD:”作为前缀要求输入密码。

然后执行操作并在需要时处理错误而不是防范它:

sudo -u postgres bash -c "psql -U postgres -c "CREATE DATABASE "

可能对 $1 进行单引号,如果您希望它稳健,请转义数据库名称中的任何单引号。我在上面向您展示了一个 shell (bash),因此可以轻松标记错误处理。

只需将您的 psql 命令传递给 su:

sudo su postgres -c "psql -U postgres -tc \"SELECT 1 FROM pg_database WHERE datname = 'test_db'\" | \
  grep -q 1 || psql -U postgres -c \"CREATE DATABASE test_db\""

如果要将 datname 值作为参数传递,请在脚本中将其替换为 </code>(<code></code> 等。扩展为第一、第二等传递给脚本的参数):</p> <pre><code>sudo su postgres -c "psql -U postgres -tc \"SELECT 1 FROM pg_database WHERE datname = ''\" | \ grep -q 1 || psql -U postgres -c \"CREATE DATABASE \""

并像这样调用您的脚本:

./script.sh test_db

您甚至可以有可选参数。例如,如果您想要 table 名称的可选参数(在您的示例中为 pg_database):

db=pg_database
if [ -n "" ]; then db=""; fi
sudo su postgres -c "psql -U postgres -tc \"SELECT 1 FROM $db WHERE datname = ''\" | \
  grep -q 1 || psql -U postgres -c \"CREATE DATABASE \""

并像这样调用您的脚本:

./script.sh test_db

使用默认值,否则:

./script.sh test_db other_pg_database