我正在尝试调整在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会更好。
答案 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 $?