MyDbのような大文字と小文字を区別する名前のデータベースがある場合、
psql を使用してこのデータベースのすべての権限をユーザー「user」に付与したい場合は、次のように記述します。
GRANT ALL PRIVILEGES ON DATABASE "MyDb" TO user;
それは動作します。
しかし、シェル スクリプトを使用したい場合はどうすればよいでしょうか?
次のコマンドを実行します。
su - postgres -c "psql -c \"GRANT ALL PRIVILEGES ON DATABASE \"MyDb\" TO user;\""
次のようなエラーで失敗します:ERROR: database "mydb" does not exist
答え1
シングルクォートを使うこともできます:
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
MyDb | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
$ su - postgres -c 'psql -c "grant all privileges on database \"MyDb\" to user;"'
GRANT
ただし、一重引用符内で変数を使用する場合は、変数は展開されないので注意してください。ただし、あなたの特定のケースでは問題ありません。
編集: DB 名が大文字と小文字を区別することを示すために、リクエスト内の二重引用符をエスケープして、PostGres に正しく渡す必要もあります。