2012-08-10 59 views
2

我怎样才能像下面这样的COMAND行逃脱的可能连字符:在bash PostgreSQL的psql的命令行逃生连字符

$ for i in db1 db2 db1-db2; do su - postgres -c "psql -c \"alter database \"$i\" with connection limit = 0;\""; done 

ALTER DATABASE 


ALTER DATABASE ERROR: syntax error at or near "-" at character 19 LINE 1: alter database db1-db2 with connection limit = 0; 
        ^
+0

为什么'DB1-db2'上的第一个地方? – C2H5OH 2012-08-10 10:00:06

回答

5

的“报价地狱”可以通过提供标准输入的SQL以某种方式缓解作为here-string

在你的情况,我认为这应该做的工作:

for i in db1 db2 db1-db2; do su - postgres -c "(psql <<EOF 
alter database \"$i\" with connection limit = 0; 
EOF 
)"; done 
+1

如果你打算使用这里的字符串(好主意恕我直言),它可以通过“su”而不是插入:相当于'echo'alter database''$ i'“来提供...'| su - postgres -c psql' – araqnid 2012-08-10 10:15:30

+1

您可以将for循环的输出传递给su/psql,而不是在每个循环迭代中执行su。 – araqnid 2012-08-10 10:17:29

3

这将做到这一点:

for i in db1 db2 db1-db2 
    do 
    su - postgres -c "psql -c \"alter database \\\"$i\\\" with connection limit = 0;\"" 
    done 

问题不逃脱的连字符,问题是你有字符串中的字符串。因此,您必须为su命令转义一次,并为psql命令转义一次。

这个如果你不喜欢多个转义序列。

for i in db1 db2 db1-db2 
    do 
    su - postgres -c "psql -c 'alter database \"$i\" with connection limit = 0;'" 
    done 

使用'singelquotes和“DBL报价,你逃脱少做。;-)