【问题标题】:Create postgresql database entry using bash script使用 bash 脚本创建 postgresql 数据库条目
【发布时间】:2015-03-06 09:34:13
【问题描述】:

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

谁能告诉我哪里出错了?

【问题讨论】:

  • `\` 不是多余的吗?
  • 可能,但它真的会导致它失败吗?
  • 有一种方法可以知道:删除所有反斜杠有帮助吗?

标签: bash postgresql shell debian


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    • $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\')"
      

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2019-06-30
        • 2018-04-12
        • 1970-01-01
        • 2015-05-25
        • 2013-08-15
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        • 2012-10-05
        相关资源
        最近更新 更多