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 コマンドで 1 回、psql コマンドで 1 回エスケープする必要があります。

これは、複数のエスケープ シーケンスが気に入らない場合に使用します。

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

' singelquotes と " dbl quotes を使用すると、エスケープする必要が少なくなります。;-)

于 2012-08-10T10:09:00.723 に答える