使用bash脚本创建postgresql数据库条目

时间:2015-03-06 09:34:14

标签: bash postgresql shell debian

以下是我的bash脚本中应该创建前端用户的部分:

DBUSER="testing"
DBNAME="testing"
ADMIN_NAME="A"
ADMIN_LNAME="B"
ADMIN_EMAIL="admin@test.net"
ADMIN_PASSWORD="'password'"

PGPASSWORD=$DBPASS psql -U $DBUSER -d $DBNAME -h 127.0.0.1 -c "INSERT INTO users_user VALUES (1, \'$ADMIN_NAME\', \'$ADMIN_LNAME\', \'$ADMIN_EMAIL\', \'$ADMPASS\', \'true\', \'zxc\')"

结果我明白了:

ERROR:  syntax error at or near "\"                                                                                              
LINE 1: INSERT INTO users_user VALUES (1, \'A\', \'B\', \'...     

有谁能告诉我哪里出错了?

3 个答案:

答案 0 :(得分:2)

根据您的代码,您需要在单引号之前删除反斜杠。除非是故意的,否则您需要从ADMIN_PASSWORD变量中删除单引号。

我还建议引用像Michael Jaros所描述的bash变量。虽然您的代码中似乎没有任何东西需要它,但这是一个很好的习惯,有助于使变量使用更加明显,并可以防止将来需要该语法的问题。因此,根据这些建议,您的代码最终会成为:

DBUSER="testing"
DBNAME="testing"
ADMIN_NAME="A"
ADMIN_LNAME="B"
ADMIN_EMAIL="admin@test.net"
ADMIN_PASSWORD="password"

PGPASSWORD=${DBPASS} psql -U ${DBUSER} -d ${DBNAME} -h 127.0.0.1 -c "INSERT INTO users_user VALUES (1, '${ADMIN_NAME}', '${ADMIN_LNAME}', '${ADMIN_EMAIL}', '${ADMPASS}', 'true', 'zxc')"

答案 1 :(得分:1)

  • $ADMPASS可能未定义,因为您还有$ADMIN_PASSWORD

  • 在双引号内,请确保将变量名称包装在大括号中,如下所示:

    ${ADMIN_NAME}
    

    否则Bash将无法始终将它们与后续字符分开。

    然后整行将如下所示:

    PGPASSWORD="$DBPASS" psql -U "$DBUSER" -d "$DBNAME" -h 127.0.0.1 -c "INSERT INTO users_user VALUES (1, \'${ADMIN_NAME}\', \'${ADMIN_LNAME}\', \'${ADMIN_EMAIL}\', \'${ADMIN_PASSWORD}\', \'true\', \'zxc\')"
    

    请注意,我还引用了其他变量替换,这是避免空格和特殊字符出现问题的最佳做法。

答案 2 :(得分:1)

另一个安全可读的sql脚本 - 使用psql客户端变量:

# create table foo(email text, pass text);

EMAIL="xx@xx"
PASS="jsjsj"

echo "insert into foo values (:'email',:'pass')" \
     | PGPASSWORD=$DBPASS psql postgres -v email="$EMAIL" -v pass="$PASS"