2012-08-10 58 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報價,你逃脫少做。;-)