Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash postgresql psql命令行中的转义连字符_Bash_Postgresql - Fatal编程技术网

bash postgresql psql命令行中的转义连字符

bash postgresql psql命令行中的转义连字符,bash,postgresql,Bash,Postgresql,如何在comand行中避开可能的连字符,如下所示: $ 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

如何在comand行中避开可能的连字符,如下所示:

$ 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;
                      ^
通过在标准输入中提供SQL作为一个函数,可以在某种程度上缓解“引用地狱”的问题

在你的情况下,我认为这应该起作用:

for i in db1 db2 db1-db2; do su - postgres -c "(psql <<EOF
alter database \"$i\" with connection limit = 0;
EOF
)"; done
db1-db2中i的
;做su-postgres-c”(psql这样做:

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

通过使用“SingleQuotes”和“dbl quotes”,您可以减少转义操作。-

为什么
db1-db2
首先在那里?如果您要使用here字符串(好主意imho),它可以“通过”su而不是插值:相当于
echo'alter database'$i'输入”使用…“| su-postgres-cpsql
您也可以将for循环的输出通过管道传输到su/psql,而不是在每个循环迭代中执行su。