2

如何在命令行中转义可能的连字符,如下所示:

$ 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;
                      ^
4

2 回答 2

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
于 2012-08-10T10:06:06.777 回答
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

通过使用 ' 单引号和 " dbl 引号,您可以减少转义。;-)

于 2012-08-10T10:09:00.723 回答