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

Create postgresql database entry using bash script

下面是我的 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\', \'...     

谁能告诉我哪里出错了?

  • $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\')"
    

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

另一个安全且可读的 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"

根据您的代码,您需要删除单引号前的反斜杠。此外,除非有意,否则您需要从 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')"