如何在Ubuntu 16上的shell脚本中使用postgres用户

时间:2017-04-13 18:35:11

标签: postgresql shell ubuntu psql

我正在尝试调整在Debian 7上运行的shell脚本集,以便在Ubuntu 16上运行。

除了执行PosgreSQL数据库命令的部分外,我必须成功更改所有内容。

以前版本的脚本有以下几行:

service postgresql restart

psql -q -U postgres -c "DROP DATABASE IF EXISTS db_crm" -o $log &> /dev/null
psql -q -U postgres -c "CREATE DATABASE db_crm" -o $log &> /dev/null

当我尝试在Ubuntu 16上运行如上所述的psql时,操作系统无法识别命令。重要的是要用sudo调用脚本。

我必须找到一种方法,只在Ubuntu 16上更改代码运行数据库脚本,所以:

service postgresql restart

su postgres <<EOF

psql -c "DROP DATABASE IF EXISTS db_crm" -o $log &> /dev/null
psql -c "CREATE DATABASE db_crm" -o $log &> /dev/null

然而,当主脚本调用它时,同样的脚本不起作用。以下消息如下:

here-document at line 41 delimited by end-of-file (wanted 'EOF')

syntax error: unexpected end of file

即使将EOF替换为下一行的开始,错误也会继续。

如果有一种方法在shell脚本中使用psql而不使用EOF会更好。

1 个答案:

答案 0 :(得分:0)

您的脚本失败的原因是,您在输入末尾忘记了EOF

su postgres <<EOF

psql -c "DROP DATABASE IF EXISTS db_crm" -o $log &> /dev/null
psql -c "CREATE DATABASE db_crm" -o $log &> /dev/null

EOF   #<<<--- HERE

一种简单的方法是将命令放入一个临时文件,然后将其重定向到psql中。显然,您不希望此操作在出现密码提示时停止,在这种情况下,请使用不需要密码的用户,或者设置$PGPASSWORD-或在脚本开头提示您-有很多方法可以解决

#! /usr/bin/env bash

# PGPASSWORD='' #(set this to stop password prompts, but it's insecure)
PSQL="psql -q -U postgres -o $log"  #TODO define $log
TMPFILE="/tmp/sql-tmp.`date +%Y%m%d_%H%M%S_%N`.sql"

# TODO - check $TMPFILE does not exist already

echo "DROP DATABASE IF EXISTS db_crm;" > "$TMPFILE"
echo "CREATE DATABASE db_cr;" >> "$TMPFILE"
# ... etc.

# run the command, throw away any stdout, stderr
PSQL < "$TMPFILE" 2>&1 > /dev/null

# exit with the psql error code
err_code=$?
exit $?