在shell中为postgresql转义单引号

时间:2014-06-07 08:09:51

标签: linux postgresql shell escaping

我尝试在postgres帐户下通过psql执行sql。我能运行sql 不包含引号

root@server:/home/rosta/SCRIPTS# su postgres -c "psql -c 'SELECT NOW()'"
              now
-------------------------------
2014-06-07 09:38:17.120368+02
(1 row)

包含SELECT'hi'等引号的sql查询出现问题。我测试 简单的'hi',但我想从shell脚本执行类似的操作。

su postgres -c "psql -c 'create database $DB_NAME template=template0 encoding='utf8' owner=aaa lc_collate='cs_CZ.utf8''"

任何人都可以告诉我如何在上面的命令中绕过编码和整理的引号

由于

罗斯塔

我的一些测试

root@server:/home/rosta/SCRIPTS# su postgres -c "psql -c 'SELECT \'hi\''"
bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file
root@server:/home/rosta/SCRIPTS# su postgres -c "psql -c 'SELECT \\'hi\\''"
bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file
root@server:/home/rosta/SCRIPTS# su postgres -c 'psql -c \'SELECT \\'hi\\'\''

2 个答案:

答案 0 :(得分:4)

最简单的方法是使用' here here' ,忽略所有引用:

#!/bin/sh
DB_NAME=my_data_base

psql -U postgres postgres <<STOP_IT
create database $DB_NAME template=template0
  encoding='utf8'
  owner=aaa
  lc_collate='cs_CZ.utf8'
  ;
STOP_IT

答案 1 :(得分:3)

我通常使用双引号(")表示postgres -c的参数,并使用双引号(\")表示psql -c的参数。这样,我可以在SQL字符串中使用单引号('),没有问题:

[root@mycomputer ~]# su postgres -c "psql -c \"SELECT 'hi'  \" "
 ?column? 
----------
 hi
(1 row)