使用 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')"
下面是我的 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')"