如果 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
我想在下面的 .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